这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战
与其他验证器的交互
如果将模型的特定字段设置为不允许为 null(使用 allowNull: false),并且该值已设置为 null,则将跳过所有验证器,并抛出 ValidationError.
另一方面,如果将其设置为允许 null(使用 allowNull: true),并且该值已设置为 null,则仅会跳过内置验证器,而自定义验证器仍将运行.
可以拥有一个字符串字段,该字段用于验证其长度在5到10个字符之间,但也允许使用 null (因为当该值为 null 时,长度验证器将被自动跳过):
class User extends Model {}
User.init({
username: {
type: DataTypes.STRING,
allowNull: true,
validate: {
len: [5, 10]
}
}
}, { sequelize });
可以使用自定义验证器有条件地允许 null 值,因为不会跳过它:
class User extends Model {}
User.init({
age: Sequelize.INTEGER,
name: {
type: DataTypes.STRING,
allowNull: true,
validate: {
customValidator(value) {
if (value === null && this.age !== 10) {
throw new Error("除非年龄为10,否则名称不能为 null");
}
})
}
}
}, { sequelize });
可以通过设置 notNull 验证器来自定义 allowNull 错误消息:
class User extends Model {}
User.init({
name: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull: {
msg: '请输入你的名字'
}
}
}
}, { sequelize });
模型范围内的验证
还可以定义验证,来在特定于字段的验证器之后检查模型. 例如,使用此方法,可以确保既未设置 latitude 和 longitude,又未同时设置两者. 如果设置了一个但未设置另一个,则失败.
使用模型对象的上下文调用模型验证器方法,如果它们抛出错误,则认为失败,否则将通过. 这与自定义字段特定的验证器相同.
所收集的任何错误消息都将与字段验证错误一起放入验证结果对象中,其关键字以 validate 选项对象中验证方法失败的键命名. 即便在任何时候每种模型验证方法都只有一个错误消息,但它会在数组中显示为单个字符串错误,以最大程度地提高与字段错误的一致性.
如果只给定了纬度或经度,而不是同时给出两者, 则不能验证对象. 如果尝试构建一个超出范围的纬度且没有经度的对象,则somePlace.validate() 可能会返回:
{
'latitude': ['Invalid number: latitude'],
'bothCoordsOrNone': ['Either both latitude and longitude, or neither!']
}
也可以使用在单个属性上定义的自定义验证程序(例如 latitude 属性,通过检查 (value === null) !== (this.longitude === null) )来完成此类验证, 但模型范围内的验证方法更为简洁