【问题标题】:Using findOne and findOneAndUpdate with HTTP request (mongoose)将 findOne 和 findOneAndUpdate 与 HTTP 请求一起使用(猫鼬)
【发布时间】:2017-09-10 03:18:57
【问题描述】:

我正在做一个 api rest,我想在其中使用 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)

控制器(这是我知道的使用 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)

【问题讨论】:

  • 您的问题是什么?
  • 简单,findOne和findOneAndUpdate的控制器和路由之间的正确方法是什么?我的方法只需要一个简单的解决方案

标签: javascript node.js mongodb express mongoose


【解决方案1】:

在您的 app.js/server.js 中

你应该安装了bodyparser

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

如果您将数据作为 URL 参数传递,例如 /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})
    }
   });
}

调用上述代码

GET - http://localhost:port/infoclient/3874234634 这个3874234634 是你的infocliId,你需要在路由中传递

更新用户数据

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}是从数据库返回更新的文档

调用上述代码

POST 方法 - http://localhost:port/infoclient/3874234634 带有 POST 正文中的数据 {name: 'pikachu', phone: 12345, ...}

所以您使用req.params 读取url 参数中的用户ID 和req.body 中的正文数据

【讨论】:

    【解决方案2】:

    我认为您只需将 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

    还要检查您的 findOnefindOneAndUpdate 查询的语法(因为 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

    【讨论】:

    • 还是不行,但我正在尝试通过这些链接获得解决方案,非常感谢
    • 确实如此。看看我编辑的答案。 (你也需要改变你的路线模式,不要指向同一个地方)
    【解决方案3】:

    谢谢大家,你们的回答帮助我纠正了代码中的许多问题。 问题是路线中的一个可怕的错误

    看看我是如何对两个请求使用相同的路径

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

    问题是当我使用 idusr 的标识符时,它与 ObjectId 搜索发生冲突

    现在

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 2018-10-26
      • 2018-07-15
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2011-10-25
      • 2017-10-05
      相关资源
      最近更新 更多