将findOne和findOneAndUpdate与HTTP请求一起使用(mongoose)

时间:2017-04-13 21:11:18

标签: javascript node.js mongodb express mongoose

我正在进行api休息,我想使用Postman发出HTTP请求,特别是我想执行搜索或更新mongodb文档,但这必须是一个不是提供mongo的doc_id的id

模型架构

'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(这是我用findById知道的get方法并且正在运行)

'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(这是我认为可以使用findOne工作的get方法)

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(这是我认为可以使用findOneAndUpdate工作的put方法)

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

路线(不是100%肯定)

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)

3 个答案:

答案 0 :(得分:0)

我认为您只需将 getInfoByUsr()函数中的行let idusr = req.body.idusr更改为let idusr = req.params.idusr

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

另请检查 findOne findOneAndUpdate 查询的语法(因为idusr不是Mongo _id,而是自定义字符串ID):

InfoCli.findOne({ idusr: idusr }, (err, infocli) => { ...
InfoCli.findOneAndUpdate({ idusr: idusr }, update, (err, infocliUpdate) => {..

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

答案 1 :(得分:0)

在你的app.js / server.js

您应该安装bodyparser

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

如果您要将数据作为网址参数传递,例如/infoclient/:infocliId,那么您可以使用req.params.infocliId

访问该数据

如果您使用POST正文传递,则可以使用req.body访问数据。

  

在infoClient.js

获取用户数据

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

通过

调用上述代码

获取 - http://localhost:port/infoclient/38742346343874234634是您需要传递路线的信息

更新用户数据

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

在我们使用{new : true}的更新代码中,将从DB返回更新的文档

通过

调用上述代码

POST方法 - http://localhost:port/infoclient/3874234634包含POST正文{name: 'pikachu', phone: 12345, ...}

中的数据

所以你使用req.paramsreq.body

中的正文数据阅读url参数中的userid

答案 2 :(得分:0)

谢谢大家,您的回答可以帮助我纠正代码中的许多内容。 问题是路线上的一个可怕的错误

了解我如何为两个请求使用相同的路径

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

问题在于,当我使用 idusr 的标识符时,它与 ObjectId 搜索

冲突

现在

api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)