【问题标题】:Min validation not working in Mongoose最小验证在 Mongoose 中不起作用
【发布时间】:2017-02-01 04:06:43
【问题描述】:

我有一个架构,其中余额字段声明如下所示

balance: {
    type: Number,
    min: 0,
    default: 30
}

我已将 0 设置为最小值,这样余额就不会是负值。但是当我通过更新查询减少余额值时,余额变成了负值。

我的更新查询:

User.update({
    _id: mongoose.Types.ObjectId(id)
}, {
    $inc: {
        balance: -10
    }
}, function(error, result) {
    // code
});

我的代码有什么错误吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    默认情况下,猫鼬不会在更新调用上进行验证,但是有一个选项可以做到这一点。查看猫鼬文档:http://mongoosejs.com/docs/validation.html(更新验证器)

    var opts = { runValidators: true };
    Toy.update({}, { color: 'bacon' }, opts, function (err) {
      assert.equal(err.errors.color.message,
        'Invalid color');
    });
    

    【讨论】:

      【解决方案2】:

      这些答案都没有真正回答问题。

      我遇到了这个问题,即使使用了 runValidators 标志 - Mongoose 也不会验证某些操作。如下

      https://mongoosejs.com/docs/validation.html#update-validators-only-run-for-some-operations

      最后一个值得注意的细节:更新验证器仅在以下更新操作符上运行:

      $set

      $未设置

      $push (>= 4.8.0)

      $addToSet (>= 4.8.0)

      $pull (>= 4.12.0)

      $pullAll (>= 4.12.0)

      例如,无论 number 的值如何,下面的更新都会成功,因为更新验证器会忽略 $inc。

      【讨论】:

        【解决方案3】:

        Mongoose 验证是一个内部中间件,更新时不调用;如果你想在更新时强制验证,你应该找到文档,更新属性,然后保存它。

        例如:

        User.findById(id, function(err, result) {
          if (err) return handleError(err);
          user.balance = -10;
          user.save(function(err) {
            if (err) return handleError(err);
            ...
          });
        });
        

        【讨论】:

        • 这实际上并不是在回答问题,而是提供了一个替代方案,在某些情况下可能有效,但并非总是如此。
        【解决方案4】:

        使用findByIdAndUpdate 启用更新验证(默认禁用)如下所示:

        User.findByIdAndUpdate(id, {
          $set: attributes,
        }, {
          new: true,
          runValidators: true,
        })
        .then((user) => {
          if (!user) {
            // user not found
          }
        
          console.log(user);
        })
        .catch(e => console.log(e));
        

        【讨论】:

          猜你喜欢
          • 2016-09-11
          • 2017-06-29
          • 2018-09-16
          • 1970-01-01
          • 1970-01-01
          • 2016-12-17
          • 1970-01-01
          • 2019-03-05
          • 2017-11-18
          相关资源
          最近更新 更多