3.4 Mongoose Schema的类型校验

为什么需要文档验证呢?以一个例子作为说明,schema进行如下定义

var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});

如果不进行文档验证,保存文档时,就可以不按照Schema设置的字段进行设置,分为以下几种情况

缺少字段的文档可以保存成功

var temp = mongoose.model('temp', schema);
new temp({age:10}).save(function(err,doc){
    //{ __v: 0, age: 10, _id: 597304442b70086a1ce3cf05 }
    console.log(doc);
});

包含未设置的字段的文档也可以保存成功,

未设置的字段不被保存

new temp({age:100,abc:"abc"}).save(function(err,doc){
    //{ __v: 0, age: 100, _id: 5973046a2bb57565b474f48b }
    console.log(doc);
});

包含字段类型与设置不同的字段的文档也可以保存成功,

不同字段类型的字段被保存为设置的字段类型

而通过文档验证,就可以避免以下几种情况发生

规则

数据的存储是需要验证的,不是什么数据都能往数据库里丢或者显示到客户端的,数据的验证需要记住以下规则:

  • 验证始终定义在SchemaType

  • 验证是一个内部中间件

  • 验证是在一个Document被保存时默认启用的,除非你关闭验证

  • 验证是异步递归的,如果你的SubDoc验证失败,Document也将无法保存

  • 验证并不关心错误类型,而通过ValidationError这个对象可以访问

格式

常用验证包括以下几种

  • required: 数据必须填写

  • default: 默认值

  • validate: 自定义匹配

  • min: 最小值(只适用于数字)

  • max: 最大值(只适用于数字)

  • match: 正则匹配(只适用于字符串)

  • enum: 枚举匹配(只适用于字符串)

required

将age设置为必填字段,如果没有age字段,文档将不被保存,且出现错误提示

default

设置age字段的默认值为18,如果不设置age字段,则会取默认值

min | max

将age的取值范围设置为[0,10]。如果age取值为20,文档将不被保存,且出现错误提示

match

将name的match设置为必须存在'a'字符。如果name不存在'a',文档将不被保存,且出现错误提示

enum

将name的枚举取值设置为['a','b','c'],如果name不在枚举范围内取值,文档将不被保存,且出现错误提示

validate

validate实际上是一个函数,函数的参数代表当前字段,返回true表示通过验证,返回false表示未通过验证。利用validate可以自定义任何条件。比如,定义名字name的长度必须在4个字符以上

验证失败

如果验证失败,则会返回err信息,err是一个对象该对象属性如下

一旦验证失败,ModelEntity都将具有和err一样的errors属性

可以从回调函数中接收err 信息

Last updated