在将传入值转换为我们在Schematype的属性类型中指定的类型之前,如何验证传入值的类型?
我有一个这样的模型架构(剪切了其他属性,例如名称,密码等)
const User = mongoose.model('User', {
age : {
type: Number, // type of data
default: 0, // if don't provided, client will has 0 for age value
validate(value) { //
console.log(typeof(value));
if(value === null){
throw new Error("Age can not be empty string, really ?")
} else if(value < 0) {
throw new Error('Age must be a positive number')
}
}
}
})
然后,我尝试创建一个新用户,但我尝试将布尔值赋予age,然后它将值变成1(表示true)或0(表示false)。我做了一些测试,得到的是:
值是转换为Number类型后的新值,因此,对于validate()函数,它可以为1或0
即使我将validate()函数放在类型:Number之前。仍然得到的值为1或0。
答案 0 :(得分:0)
猫鼬会尽可能将模型的值转换为架构中定义的类型。
在创建模型实例时完成转换。
仅在将模型实例保存到数据库中之前检查其有效性。
由于强制转换是在有效性检查之前完成的,因此您将在validate
函数中获取已经强制转换的值。
如果您不希望在值不是类型时强制转换Number SchemaType
数字,有一种变通方法可以为属性定义自定义set
方法。此set
方法将模型的原始值作为参数接收,并将在强制转换之前执行,因此您有机会返回无法强制转换为Number的值,例如非空字符串。这样,猫鼬在尝试保存模型实例时将抛出ValidationError
。
像这样:
const User = mongoose.model('User', {
age : {
type: Number, // type of data
default: 0, // if don't provided, client will has 0 for age value
set: v => typeof v !== 'number' ? 'Throw error' : v
}
});
对于布尔型SchemaType,您可以使用属性convertToTrue
和convertToFalse
来定义应分别将哪些值强制转换为true或false。
请检查mongoose documention以获得更多信息。