使用 findOne 和 findOneAndUpdate with HTTP 请求(猫鼬)



我正在制作一个 api 休息,我想在其中使用 Postman 发出 HTTP 请求,特别是我想执行搜索或更新 mongodb 文档,但这必须通过一个 id 而不是提供 mongo 的doc_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})     
    })
}

控制器(这是我认为可以使用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*/
    })
 }

控制器(这是我认为可以使用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})
    })
 }

路线(不是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)

在您的应用程序.js/服务器中.js

你应该安装正文解析器

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

如果您将数据作为 URL 参数传递,就像这样/infoclient/:infocliId那么您可以使用 req.params.infocliId 访问它

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

在信息客户端中.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/38742346343874234634是您需要在路由中传递的信息cliID

更新用户数据

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

调用上面的代码

开机自检方法 - http://localhost:port/infoclient/3874234634开机自检正文中的数据{name: 'pikachu', phone: 12345, ...}

因此,您使用 URL 中的 req.params 和正文数据读取 URL 中的用户 ID req.body

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


http://expressjs.com/en/api.html#req.bodyhttp://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

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

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

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

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

现在

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

相关内容

  • 没有找到相关文章

最新更新