Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

136
Vistas
Uso de findOne y findOneAndUpdate con solicitud HTTP (mangoose)

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)
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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

about 4 years ago · Santiago Trujillo Denunciar

0

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) => {..

http://mongoosejs.com/docs/api.html#model_Model.findOne

about 4 years ago · Santiago Trujillo Denunciar

0

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)
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda