Javascript 在HTTP请求中使用findOne和findOneAndUpdate(mongoose)

Javascript 在HTTP请求中使用findOne和findOneAndUpdate(mongoose),javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在制作一个api rest,我想在其中使用Postman发出HTTP请求,特别是我想执行搜索或更新mongodb文档,但这必须由一个id完成,而该id不是提供mongo的doc_id 模型模式 'use strict' const mongoose = require('mongoose') const Schema = mongoose.Schema const infoClientSchema = Schema ({ idusr: String,

我正在制作一个api rest,我想在其中使用Postman发出HTTP请求,特别是我想执行搜索或更新mongodb文档,但这必须由一个id完成,而该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方法,正在工作)

控制器(这是我认为使用findOne可以工作的get方法)

控制器(这是我认为可以使用findOneAndUpdate的put方法)

路线(对此不是100%确定)


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


还要检查findOne和findOneAndUpdate查询的语法(因为
idusr
不是Mongo\u id,而是某种自定义字符串id):


在app.js/server.js中

你应该安装

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) 
api.post('/infoclient/:idusr', InfoCliCtrl.updateByUsr)
如果您将数据作为URL参数传递,例如
/infoclient/:infocliId
,那么您可以使用
req.params.infocliId

如果您使用POST body进行传递,则可以使用
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})
    }
   });
}
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)
    }
   });
}
调用上面的代码

获取-
http://localhost:port/infoclient/3874234634
3874234634
是您需要在路线中通过的信息cliid

更新用户数据

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})
    }
   });
}
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
文章正文中有数据
{姓名:'pikachu',电话:12345,…}


因此,您使用
req.params
req.body

中的body数据读取url参数中的userid。谢谢大家,您的回答帮助我更正了代码中的许多内容。 这个问题是路线上的一个可怕的错误

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

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)
问题是,当我为idusr使用标识符时,它与ObjectId搜索冲突

现在


您的问题是什么?很简单,findOne和findOneAndUpdate的控制器和路由之间的正确方法是什么?我只是需要一个简单的解决方案为我的方法它仍然不起作用,但我正试图通过这些链接得到解决方案,非常感谢。看看我编辑过的答案。(您还需要更改路线模式,使其不指向同一位置)
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})
    }
   });
}
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)
    }
   });
}
api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)
api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)