Mongodb 已编辑:Mongoose-如何仅允许所有者更新当前文档?
编辑: 摘要 对于要更新特定项目的用户,用户创建项目时已保存的用户id必须与其当前用户id匹配。当前用户保存在req.users中,以便在用户登录后可以访问 在我的Mongoose项目模式中,我有以下内容Mongodb 已编辑:Mongoose-如何仅允许所有者更新当前文档?,mongodb,mongoose,Mongodb,Mongoose,编辑: 摘要 对于要更新特定项目的用户,用户创建项目时已保存的用户id必须与其当前用户id匹配。当前用户保存在req.users中,以便在用户登录后可以访问 在我的Mongoose项目模式中,我有以下内容 const projectSchema = new mongoose.Schema( { name: String, description: String, userId: mongoose.Schema.ObjectId, } ... 如果在find()上查询,它将返回: {
const projectSchema = new mongoose.Schema(
{
name: String,
description: String,
userId: mongoose.Schema.ObjectId,
}
...
如果在find()上查询,它将返回:
{
_id: 213213156,
name: "Project1",
description: "A brief description"
userId: 3131132, //this is the user that created this project
}
它是如何工作的?
每次创建项目时,我都会分配当前登录用户拥有的用户ID
我试过什么?
我尝试使用Model.find()进行查询,获取用户ID,然后生成一个if语句
我也试过做一些前置软件,但我认为我没有正确地使用它们
我想做什么?
我希望仅当项目的auth_id(存储在req.users中的当前用户id)与项目userId字段匹配时,才能够更新该项目——该字段已保存在该项目中
前
findOneById接受多个条件,所以您可以首先
搜索要修改的_id,在第二个条件中,
userId必须与当前用户匹配
findOneById接受多个条件,所以您可以首先
搜索要修改的_id,在第二个条件中,
userId必须与当前用户匹配
你能发布样本数据并用步骤解释吗。。。恐怕不只我一个人感到困惑。我会编辑这篇文章,让它更清晰。你需要类似这样的东西:
Model.updateOne({userId:req.users.\u id},{your\u project})
?我可以使用findbyidanddupdate和updateOne,但我的想法是只有作为userId的项目所有者才能更新它。。。这就是为什么我要首先验证模型的用户id是否与保存在登录令牌中的用户id匹配。@Valijon添加了更多信息,并更改了标题。您能否发布示例数据并用步骤进行解释。。。恐怕不只我一个人感到困惑。我会编辑这篇文章,让它更清晰。你需要类似这样的东西:Model.updateOne({userId:req.users.\u id},{your\u project})
?我可以使用findbyidanddupdate和updateOne,但我的想法是只有作为userId的项目所有者才能更新它。。。这就是为什么我要首先验证模型的用户id是否与保存在登录令牌中的用户id匹配。@Valijon添加了更多信息,并更改了标题。
//I have set this router so that is protected, so users need to login.
Routing:
router
.route("/:projectId")
.get(projectsController.getProject)
.patch(authController.protect, projectsController.updateProject);
// I want to be able to access the userId without having to query find() -- because then I would have to perform 2 queries: find() and then findByIdAndUpdate
if(userId !== req.user.id) {
return new Error(msg)
}
Model.findOneAndUpdate({
_id: req.params.projectId,
userId: req.user.id
}, ...