我在后端使用Node,Express和MongoDB / Mongoose。我已设置以下PUT
路线:
//where id is the unique id of the review, not the movie
router.put('/update/:id', [jsonParser, jwtAuth], (req, res) => {
Review.findOneAndUpdate(req.params.id,
{ $set: { ...req.body } }, { new: true })
.then(review => {
console.log(review);
res.status(203).json(review);
})
.catch(err => res.status(500).json({message: err}));
});
在我的POST
路线上创建新文档时使用邮递员,响应如下:
{
"genre_ids": [
"28"
],
"_id": "5ce112d0aeadc44ea0ea7bb0",
"movieId": 447404,
"title": "Pokemon Detective Pikachu",
"poster_path": "/wgQ7APnFpf1TuviKHXeEe3KnsTV.jpg",
"reviewer": "5cda5d08f3a74252c83b4a63",
"reviewTitle": "the best",
"reviewText": "new review",
"reviewScore": 5,
"__v": 0
}
当我尝试在此URL上更新以下文档时使用邮递员
.../review/update/5ce112d0aeadc44ea0ea7bb0
,其中id是从上方POST
响应的_id中获取的。
我在PUT
请求中做了一个非常简单的更改,只是为了更改分数。
{
"reviewScore": 1
}
然后我从PUT
路由中收到以下响应。
{
"genre_ids": [
"28"
],
"_id": "5ce089116b537a08403ed25f",
"movieId": 447404,
"title": "Pokemon Detective Pikachu",
"poster_path": "/wgQ7APnFpf1TuviKHXeEe3KnsTV.jpg",
"reviewer": "5ce0882d90b63613700b066a",
"reviewTitle": "the best",
"reviewText": "updated review",
"reviewScore": 1,
"__v": 0
}
您可以看到,在PUT
请求响应中,_id
和reviewer
均已更改。实际上,它已经为另一个用户创建了一个新文档,而不是更新原始文档。如果我登录到_id
响应提供的属于PUT
的帐户,则确实显示该帐户已经创建了一个新文档,而没有更新其他/原始帐户的文档。< / p>
为什么会这样?请帮忙。
答案 0 :(得分:0)
您需要将条件作为对象提供。
router.put('/update/:id',
[jsonParser, jwtAuth],
(req, res) =>{
Review.findOneAndUpdate({'_id' :req.params.id}, { $set: { ...req.body } }, { new: true })
.then(review => { console.log(review);
res.status(203).json(review);
})
.catch(err => res.status(500).json({message: err}));
}
);
或者,如果您想像代码中一样直接使用id
,只需将findOneAndUpdate
替换为findByIdAndUpdate
。
答案 1 :(得分:0)
您当前的查询条件是错误的。进行如下更改。
router.put('/update/:id', [jsonParser, jwtAuth], (req, res) => {
Review.findOneAndUpdate({'_id' : req.params.id},
{ $set: { ...req.body } }, { new: true })
.then(review => {
console.log(review);
res.status(203).json(review);
})
.catch(err => res.status(500).json({message: err}));
});