验证(validation)

原文:Validation 翻译:小虾米(QQ:509129)

Validation

在我们进入验证语法的细节之前,请记住以下的规则:

  • 验证是在SchemaType定义

  • 验证是中间件。Mongoose寄存器验证作为pre('save')钩子在每个模式默认情况下。

  • 你可以手动使用doc运行验证。validate(callback) or doc.validateSync()

  • 验证程序不运行在未定义的值上。唯一的例外是required验证器

  • 验证异步递归;当你调用Model#save,子文档验证也可以执行。如果出现错误,你的 Model#save回调接收它。

  • 验证是可定制的。

 var schema = new Schema({
      name: {
        type: String,
        required: true
      }
    });
    var Cat = db.model('Cat', schema);

    // This cat has no name :(
    var cat = new Cat();
    cat.save(function(error) {
      assert.equal(error.errors['name'].message,
        'Path `name` is required.');

      error = cat.validateSync();
      assert.equal(error.errors['name'].message,
        'Path `name` is required.');
    });

内置验证器

Mongoose有几个内置验证器。

每一个上述的验证链接提供更多的信息关于如何使他们和自定义错误信息。

自定义验证器

如果内置验证器是不够的话,你可以自定义验证器来适应你的需求。

自定义验证是通过传递验证函数声明的。你可以找到详细说明如何在SchemaType#validate() API文档

异步的自定义验证器

自定义验证器可以异步。如果你的验证函数接受2个参数,mongoose将视为第二个参数是一个回调。

即使你不想使用异步验证,小心,因为mongoose 4 视为所有的带2个参数函数是异步的,像validator.isEmail 功能

验证错误

验证失败后Errors返回一个错误的对象实际上是validatorerror对象。每个ValidatorError有kind, path, value, and message属性。

Required验证在嵌套的对象

定义嵌套对象验证器在mongoose是是棘手的,因为嵌套对象不完全成熟的路径。

更新(update)验证器

上面的例子,你了解了文档的验证。Mongoose也支持update()findoneandupdate()操作的验证。在Mongoose 4.x,更新验证器是默认关闭-您需要指定runvalidators选项。

开启更新验证器,设置runValidators选项为update()findOneAndUpdate()。小心:更新验证器默认关闭因为他们有几个注意事项。

更新(update)验证器和this

更新(update)验证器和文档(document)验证器有一个主要的区别。在上面的颜色验证功能中,这是指在使用文档(document)验证时所进行的文档的验证。然而,运行更新验证时,被更新的文件可能不在服务器的内存中,所以默认情况下这个值不定义。

context 选项

context选项允许你在更新验证器设置此值为相关查询。

路径更新验证器 (Update Validator Paths)

另一个主要差别,更新验证器只能运行在指定的路径中的更新。例如,在下面的示例中,因为在更新操作中没有指定“name”,更新验证将成功。

使用更新(update)验证器,required验证器验证失败时,你要明确地$unset这个key。

更新指定的路径只运行验证器

(Update Validators Only Run On Specified Paths)

最后值得注意的一个细节:更新(update)验证器只能运行在 $set 和 $unset 选项。例如,下面的更新将成功,无论数字的值。

Last updated

Was this helpful?