【问题标题】:Why Mongoose doesn't validate empty document?为什么 Mongoose 不验证空文档?
【发布时间】:2013-12-28 01:38:21
【问题描述】:

假设我有一个非常简单的架构,其中包含一个始终返回 false 的自定义验证函数。

var MofoSchema = new mongoose.Schema({
  name: String
});

MofoSchema.path('name').validate(function (value) {
  console.log("I'm validating");
  return false;
}, 'No pasaran');

mongoose.model('Mofo', MofoSchema);

然后我创建我的文档的一个新实例并验证它:

var Mofo = mongoose.model('Mofo');
var mofo = new Mofo({name: "Tarte flambée"});

mofo.validate(function(err) {
  console.log(err);
});

完美,调用了自定义验证器函数并填充了err

但现在我做了同样的事情没有数据

var Mofo = mongoose.model('Mofo');
var mofo = new Mofo({});

mofo.validate(function(err) {
  console.log(err);
});

自定义验证器函数未被调用err 未定义。 为什么?我不明白为什么 Mongoose 没有运行自定义验证器。

这是设计使然吗?它是一个错误吗? 我应该扭转局面吗?我应该在验证之前手动检查空数据吗?

我做错了吗?

PS:如果你调用save,文档将在MongoDB中保存为空,尽管有自定义验证器。

【问题讨论】:

    标签: node.js validation mongoose


    【解决方案1】:

    我认为 mongoose 只会验证现有字段。

    所以你可以使用'null'值来激活验证

    var mofo = new Mofo({name: null});
    

    对于空或未定义

    var MofoSchema = new mongoose.Schema({
      name: {type: String, required: true}
    });
    
    MofoSchema.path('name').validate(function (value) {...}, 'no pasaran');
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      var mofo = new Mofo({ name: { type: String, default: ''} });
      

      这将确保您始终在该键上有一个值来触发验证。它还使您的架构定义更易于阅读。

      【讨论】:

        猜你喜欢
        • 2019-06-03
        • 2014-09-15
        • 2020-05-22
        • 2012-09-11
        • 2018-05-02
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 2018-01-07
        相关资源
        最近更新 更多