Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

130
Views
Using findOne and findOneAndUpdate with HTTP request (mongoose)

I am making an api rest in which I want to make HTTP requests using Postman, specifically I want to perform a search or update a mongodb document, but this must be by an id which is not the doc_id that provides mongo

models Schema

'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)

Controller (This is the get method I know using findById and is working)

'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})     
    })
}

Controller (This is the get method which I thought would work using 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*/
    })
 }

Controller (This is the put method which I thought would work using 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})
    })
 }

Routes (not 100% sure about this)

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 answers
Answer question

0

In your app.js/server.js

you should have bodyparser installed

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) 
api.post('/infoclient/:idusr', InfoCliCtrl.updateByUsr)

If you are passing data as URL parameter, like this /infoclient/:infocliId then you can access that using req.params.infocliId

If you are passing using POST body then you can access data using req.body.

In infoClient.js

To fetch user data

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})
    }
   });
}

Call the above code by

GET - http://localhost:port/infoclient/3874234634 this 3874234634 is your infocliId you need to pass in route

To update user data

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)
    }
   });
}

In the update code we have used {new : true} is to return updated document from DB

Call the above code by

POST method - http://localhost:port/infoclient/3874234634 with data in POST body {name: 'pikachu', phone: 12345, ...}

so you read the userid in url parameter using req.params and body data in req.body

about 4 years ago · Santiago Trujillo Report

0

I think you simply need to change the line let idusr = req.body.idusr in your getInfoByUsr() function to let idusr = req.params.idusr

http://expressjs.com/en/api.html#req.body
http://expressjs.com/en/api.html#req.params

Also check the syntax of your findOne and findOneAndUpdate query (because idusr is not a Mongo _id but sort of custom String id):

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 Report

0

Thank you all, your answers help me to correct many things in the code. The problem was a horrible mistake in the routes

See how I was using the same path for two requests

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)

The problem was that when I used the identifier for idusr it was in conflict with the ObjectId search

Now

api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!