为什么Mongoose不验证空文档?

时间:2013-12-10 13:42:13

标签: node.js validation mongoose

假设我有一个非常简单的模式,其自定义验证函数始终返回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中保存为空。

2 个答案:

答案 0 :(得分: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');

答案 1 :(得分:0)

你可以这样做:

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

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