将 findOne 和 findOneAndUpdate 与 HTTP 请求一起使用(猫鼬)
Posted
技术标签:
【中文标题】将 findOne 和 findOneAndUpdate 与 HTTP 请求一起使用(猫鼬)【英文标题】:Using findOne and findOneAndUpdate with HTTP request (mongoose) 【发布时间】: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的控制器和路由之间的正确方法是什么?我的方法只需要一个简单的解决方案 【参考方案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.bodyhttp://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
【讨论】:
还是不行,但我正在尝试通过这些链接获得解决方案,非常感谢 确实如此。看看我编辑的答案。 (你也需要改变你的路线模式,不要指向同一个地方)【参考方案3】:谢谢大家,你们的回答帮助我纠正了代码中的许多问题。 问题是路线中的一个可怕的错误
看看我是如何对两个请求使用相同的路径
api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)
问题是当我使用 idusr 的标识符时,它与 ObjectId 搜索发生冲突
现在
api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)
【讨论】:
以上是关于将 findOne 和 findOneAndUpdate 与 HTTP 请求一起使用(猫鼬)的主要内容,如果未能解决你的问题,请参考以下文章
猫鼬 findOneAndUpdate 和 runValidators 不工作
猫鼬 findOneAndUpdate 和 runValidators 不工作
Mongoose FindOneandUpdate - 仅更新特定字段将其他字段保留为以前的值