【问题标题】:Mongoose fails to update existing document when a field is required需要字段时,Mongoose 无法更新现有文档
【发布时间】:2018-02-26 22:59:45
【问题描述】:

我使用 MEANjs 创建应用程序并使用 yo 生成器添加了 CRUD 模块。我还在应用程序中注册了两个用户。之后,我使用“用户 1”创建了一些记录。现在我需要允许“用户 2”更新“用户 1”的记录。默认情况下,这将是不允许的,但我需要覆盖该逻辑并允许每个具有“用户”角色的用户编辑每个现有记录,即使是那些不是由他创建的记录。我无法找到如何做到这一点。谁能分享一些见解?

【问题讨论】:

    标签: mongoose meanjs


    【解决方案1】:

    由于您似乎不希望每个用户都拥有“管理员”角色(授予完全控制权),因此您需要在 CRUD 模块中编辑策略文件。

    使用文章模块有一个例子:

    如果你去/modules/articles/server/policies/articles.server.policy.js,你需要更新角色“用户”的权限:

    , {
        roles: ['user'],
        allows: [{
          resources: '/api/articles',
          permissions: ['get']
        }, {
          resources: '/api/articles/:articleId',
          permissions: ['get']
        }]
      },
    

    要允许任何用户编辑文章,请将“put”权限添加到数组中:

    , {
          resources: '/api/articles/:articleId',
          permissions: ['get', 'put']
    }
    

    其他可能的解决方案是在文章模型架构(位于/modules/articles/server/models/article.server.model.js)中创建一个 ObjectId 数组,该数组将存储允许编辑文章的用户的所有 ID。像这样的:

    allowedUsers: [{ type : ObjectId, ref: 'User' }]
    

    但是,通过这种方式,您需要在策略文件中定义的 isAllowed 中间件中添加更多逻辑,以便每次有人更新文章时,您都会检查 article.allowedUsers 数组是否包含创建的用户的 id请求(req.user id)。

    【讨论】:

    • 感谢您的意见!我已经尝试在 *.policy.js 文件中扩展“权限”属性,但我很惊讶它没有完成这项工作。比较用户的 id 似乎是另一种解决方法,但效果不佳。问题是调用数据库 shema 的任何实例的 save() 都会返回错误 400,并显示任何标记为必需的字段都是空的,即使它们已被填充并正确传递给数据库。这可能是由于持续更新 shema 并在此过程中创建文件造成的吗?
    • 这看起来很奇怪,你应该检查你的模型架构。此外,您应该看看您将哪些字段保存到控制器中的数据库中......也许您缺少一个属性。
    • 经过多次尝试,我决定下载最新版本的 MEANJS,并将我已经创建的模块添加到更新的骨架中。这起到了一种魅力。现在我可以按照设计通过 *.policy 文件控制对 URI 的访问。我不确定我的版本出了什么问题。无论如何......这次重新开始有帮助:)。感谢您的输入。我仍然学会了使用 ID 的诀窍
    • @PavelPavlov 很高兴听到 :)
    猜你喜欢
    • 2019-02-26
    • 2018-10-09
    • 2020-02-07
    • 2015-11-08
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多