我正在进行api休息,我想使用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)
Controller(这是我用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)
答案 0 :(得分:0)
我认为您只需将 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
另请检查 findOne 和 findOneAndUpdate 查询的语法(因为idusr
不是Mongo _id,而是自定义字符串ID):
InfoCli.findOne({ idusr: idusr }, (err, infocli) => { ...
InfoCli.findOneAndUpdate({ idusr: idusr }, update, (err, infocliUpdate) => {..
答案 1 :(得分:0)
在你的app.js / server.js
中您应该安装bodyparser
api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli)
api.post('/infoclient/:idusr', InfoCliCtrl.updateByUsr)
如果您要将数据作为网址参数传递,例如/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})
}
});
}
通过
调用上述代码获取 - http://localhost:port/infoclient/3874234634
此3874234634
是您需要传递路线的信息
更新用户数据
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}
的更新代码中,将从DB返回更新的文档
通过
调用上述代码 POST方法 - http://localhost:port/infoclient/3874234634
包含POST正文{name: 'pikachu', phone: 12345, ...}
所以你使用req.params
和req.body
答案 2 :(得分:0)
谢谢大家,您的回答可以帮助我纠正代码中的许多内容。 问题是路线上的一个可怕的错误
了解我如何为两个请求使用相同的路径
api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr)
问题在于,当我使用 idusr 的标识符时,它与 ObjectId 搜索
冲突现在
api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)