javascript - 在转换为模式类型猫鼬之前验证原始传入值
问题描述
在将传入值转换为我们在 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')
}
}
}
})
然后我尝试创建一个新用户,但我尝试将布尔值赋予年龄,它变成值 1 表示真或 0 表示假。我做了一些测试,我得到的是:
validate 函数上的 value 是它转换为 Number 类型后的新值,所以在 validate() 函数中,它可以是 1 或 0
即使我把 validate() 函数放在 type: Number. 仍然得到值为 1 或 0。
解决方案
Mongoose 将尽可能将模型的值转换为模式中定义的类型。
创建模型实例时完成转换。
模型实例的有效性在将其保存到数据库之前进行检查。
因为转换是在有效性检查之前完成的,所以你得到的值已经在validate
函数中转换了。
如果您不希望在Number SchemaType
值不是 number 类型时强制转换,则有一种解决set
方法可以为该属性定义自定义方法。此set
方法接收模型的原始值作为参数,并将在转换之前执行,因此您有机会返回一个无法转换为数字的值,例如非空字符串。这样,猫鼬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
}
});
对于 Boolean SchemaType,您可以使用属性convertToTrue
并convertToFalse
定义应分别将哪些值强制转换为 true 或 false。
请查看猫鼬文档以获取更多信息。
推荐阅读
- android - 如何修复 AlertDialog 不包装到所有设备上的布局
- haskell - 在 Haskell 中创建滚动NDice 的函数的问题
- rust - 如何编写一个知道实现者是 [u8] 的 trait 方法?
- amazon-web-services - 无权执行:资源上的 sts:AssumeRole
- java - Java字符串/整数不会解析为枚举
- apache-spark - 推入现有本地表失败(Windows):InvalidRegionNumberException 然后 IllegalArgumentException
- c# - 似乎无法修复:System.BadImageFormatException:无法加载文件或程序集“System.Data.SqlClient”
- angular - NGRX 效果 - 分派的动作不按顺序执行
- java - Spring Boot 应用程序之间的 REST 通信
- assembly - 在引导加载程序中 JMPing 到 0x7C00 不会导致无限循环