Estoy haciendo un resto de api en el que quiero hacer solicitudes HTTP usando Postman, específicamente quiero realizar una búsqueda o actualizar un documento mongodb, pero esto debe ser por una identificación que no es la doc_id que proporciona mongo
esquema de modelos
'use strict' const mongoose = require('mongoose') const Schema = mongoose.Schema const infoClientSchema = Schema ({ idusr: String, /*this is require*/ name: String, phone: Number, address: String, riff: String, state: String, city: String, email: {type: String} }) module.exports = mongoose.model('InfoCli',infoClientSchema)Controlador (Este es el método get que conozco usando findById y está funcionando)
'use strict' const InfoCli = require('../models/infoclient') function getInfoCli(req, res){ let infocliId = req.params.infocliId InfoCli.findById(infocliId, (err, infocli) =>{ if (err) return res.status(500).send({message: 'Error making request: $(err)'}) if (!infocli) return res.status(404).send({message: 'The client does not exist '}) res.status(200).send({infoclient: infocli}) }) }Controlador (Este es el método get que pensé que funcionaría usando findOne)
function getInfoByUsr(req, res){ let idusr = req.body.idusr InfoCli.findOne(idusr, (err, infocli) => { if (err) return res.status(500).send({message: 'Error making request: $(err)'}) if (!infocli) return res.status(404).send({message: 'The client does not exist '}) res.status(200).send({infoclient: infocli}) console.log(infocli) /*The console is not showing anything*/ }) }Controlador (Este es el método put que pensé que funcionaría usando findOneAndUpdate)
function updateByUsr(req, res){ let idusr = req.body.idusr let update = req.body InfoCli.findOneAndUpdate(idusr, update, (err, infocliUpdate) => { if (err) return res.status(500).send({message: 'Error making request: $(err)'}) if (!idusr) return res.status(404).send({message: 'The client does not exist '}) res.status(200).send({infocliente: infocliUpdate}) }) }Rutas (no estoy 100% seguro de esto)
const express = require('express') const InfoCliCtrl = require('../controllers/infoclient') const api = express.Router() api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/ api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)En su app.js/server.js
deberías tener bodyparser instalado
api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) api.post('/infoclient/:idusr', InfoCliCtrl.updateByUsr) Si está pasando datos como parámetro de URL, como este /infoclient/:infocliId , entonces puede acceder a eso usando req.params.infocliId
Si está pasando usando el cuerpo POST, puede acceder a los datos usando req.body .
En infoClient.js
Para obtener datos de usuario
exports.getInfoCli = function(req, res, next){ var incomingData = req.params.infocliId; InfoCli.findOne({idusr: incomingData}, function(err, data){ if(err){ return res.status(500); } else { return res.status(200).send({infoclient: data}) } }); }Llame al código anterior por
GET - http://localhost:port/infoclient/3874234634 este 3874234634 es su infocliId que necesita pasar en la ruta
Para actualizar los datos del usuario
exports.updateByUsr = function(req, res, next){ var userId = req.params.idusr; var updateData = req.body; InfoCli.findOneAndUpdate({idusr: userId}, updateData, {new: true }, function(err, data){ if(err){ return res.status(500); } else { return res.status(200).send(data) } }); } En el código de actualización que hemos usado {new : true} es para devolver el documento actualizado de DB
Llame al código anterior por
Método POST: http://localhost:port/infoclient/3874234634 con datos en el cuerpo POST {name: 'pikachu', phone: 12345, ...}
así que lee el ID de usuario en el parámetro url usando req.params y datos del cuerpo en req.body
Creo que simplemente necesita cambiar la línea let idusr = req.body.idusr en su función getInfoByUsr() para let idusr = req.params.idusr
http://expressjs.com/en/api.html#req.body
http://expressjs.com/en/api.html#req.params
También verifique la sintaxis de su consulta findOne y findOneAndUpdate (porque idusr no es un Mongo _id sino una especie de ID de cadena personalizado):
InfoCli.findOne({ idusr: idusr }, (err, infocli) => { ... InfoCli.findOneAndUpdate({ idusr: idusr }, update, (err, infocliUpdate) => {..Gracias a todos, sus respuestas me ayudan a corregir muchas cosas en el código. El problema fue un error horrible en las rutas.
Vea cómo estaba usando la misma ruta para dos solicitudes
api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/ api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)El problema fue que cuando usé el identificador para idusr estaba en conflicto con la búsqueda de ObjectId
Ahora
api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)