【问题标题】:Mongoose Schema secured fieldMongoose Schema 安全字段
【发布时间】:2012-11-13 08:37:06
【问题描述】:

简明扼要:有什么方法可以阻止设置架构字段但允许获取值?

我一直在Mongoose Documentation 附近,但找不到我要找的东西。

【问题讨论】:

    标签: mongoose


    【解决方案1】:

    从 mongoose 5.6 开始你可以这样做:immutable: true

    var schema = new Schema({
      securedField: {
        type: String,
        default: 'Forever',
        immutable: true
      }
    });
    

    【讨论】:

      【解决方案2】:

      你可以从设置中返回与默认值相同的值,无需参考_this文档:

      var schema = new Schema({
        securedField: {
          type: String,
          default: 'Forever',
          set: () => 'Forever'
      });
      

      【讨论】:

        【解决方案3】:

        如果您想设置一个永远不能更改的默认值,另一种选择:

        var schema = new Schema({
          securedField: {
            type: String,
            default: 'Forever',
            set: function (val) { return this.securedField; }
        });
        

        【讨论】:

        • 在 Mongoose 5.0.15 中似乎不再工作 值已正确设置为 "securedField": "Forever" 但 FindByIdandUpdate(...) 更改了它。
        • @jfrobishow 这是由于 Mongoose 5 中的更改,其中 this 在设置器中的查询(findByIdAndUpdate 在您的情况下)指的是查询而不是文档。请参阅set 文档中的最后一点。
        【解决方案4】:

        将字段定义为virtual getter,而不是传统字段。

        例如,假设您想在通过 Mongoose 访问时将集合的 pop 字段设为只读:

        var schema = new Schema({
            city: String,
            state: String
        });
        
        schema.virtual('pop').get(function() {
            return this._doc.pop;
        });
        

        通过访问模型实例的私有 _doc 成员,这可能会在将来中断,但是当我刚刚测试它时它运行良好。

        【讨论】:

        • 这是如何工作的? virtuals 不会被持久化,对吧?
        • @sidgate 这是一个旧的答案,并且有点暴露未在架构中定义但存在于基础文档中的字段。所以你是对的,虚拟不会被持久化,但由于 pop 字段已经存在,它可以工作,因为原始文档可通过(未记录的)_doc 字段获得。
        猜你喜欢
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 2013-03-11
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 2023-02-11
        相关资源
        最近更新 更多