假设我有一个非常简单的模式,其自定义验证函数始终返回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中保存为空。
答案 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: ''} });
这将确保您始终拥有该键的值以触发验证。它还使您的架构定义更易于阅读。