为啥 Mongoose 不验证空文档?

Posted

技术标签:

【中文标题】为啥 Mongoose 不验证空文档?【英文标题】: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中保存为空,尽管有自定义验证器。

【问题讨论】:

【参考方案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: '' );

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

【讨论】:

以上是关于为啥 Mongoose 不验证空文档?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose ODM,保存前更改变量

Mongoose ODM,保存前更改变量

NodeJS Express Mongoose 返回空 []

猫鼬没有加入两个系列

文档不会使用带有 mongoose 的 save() 方法保存

MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?