Javascript 在HTTP请求中使用findOne和findOneAndUpdate(mongoose)
我正在制作一个api rest,我想在其中使用Postman发出HTTP请求,特别是我想执行搜索或更新mongodb文档,但这必须由一个id完成,而该id不是提供mongo的doc_id 模型模式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,
'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)