为什么Mongoose不验证空文档?

3

假设我有一个非常简单的模式,其中包含一个自定义验证函数,该函数始终返回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没有运行自定义验证器。

这是设计上的行为吗?还是一个bug?我应该使用替代方法吗?在验证之前应该手动检查空数据吗?

我做错了什么吗?

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

2个回答

3

我认为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');

0

你可以做:

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

这将确保您始终具有触发验证的键上的值。它还使您的模式定义更易于阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接