我有一个用于博客应用程序的简单api,在猫鼬模型中使用updateOne()
和deleteOne()
方法更新/删除单个帖子时遇到问题。
逻辑很简单,通过在查询参数中传递的id来查找帖子,并且另外的要求是,帖子的所有者ID必须等于通过令牌传递并可以通过中间件访问的当前用户的id。
测试文章文档:
{
"likes": 0,
"dislikes": 0,
"_id": "5c1a49464030141b3cc357c6",
"owner": {
"id": "5c1a49074030141b3cc357c5",
"firstName": "John",
"lastName": "Smith",
"avatarSrc": "/profile-avatars/avatar1545226503543.jpg"
},
"title": ".....",
"text": ".....",
"previewSrc": "/post-previews/preview1545226565915.PNG",
"__v": 0
}
应该更新帖子的代码:
router.put('/:id', authCheck, (req, res) => {
Post.updateOne({_id: req.params.id, 'owner.id': req.userId}, req.body)
.then((result) => {
console.log(result);
res.sendStatus(200);
});
});
问题在“ owner.id”查询中,正确接收了postId和userId,但未发生更新。
答案 0 :(得分:0)
我将执行以下操作,尤其是某些属性不会更改;未经测试,但想知道结果
router.put('/:id', authCheck, (req, res) => {
let updateObj = {
likes: req.body.likes,
dislikes: req.body.dislikes,
title: req.body.title,
text: req.body.text,
previewSrc: req.previewSrc
}
Post.updateOne({_id: req.params.id, 'owner.id': req.userId}, updateObj)
.then((result) => {
console.log(result);
res.sendStatus(200);
});
});
答案 1 :(得分:0)
好的,我发现了问题:
这些id字符串是字符串对象,而不是简单的字符串,要对其进行检查:
1)首先通过ID提取帖子,然后将owner.id
与请求中的userId
进行比较,发现它们不相等;
2)将字符串与equals
方法进行比较,并返回true。
因此可以通过以下方式解决问题:
1)仅通过ID获取帖子;
2)提取帖子后,使用equals
方法比较其ID。