在 Sequelize 中使用 validate
校验的主要目的是确保数据的完整性和一致性。本文首先介绍使用validate的必要性并在此基础之上列举了几个常见的典型场景最后列举了validate的内置规则及其作用。
1. 必要性
数据完整性: 校验可以确保数据满足预期的格式和约束,防止无效或不良数据进入数据库。这有助于维护数据库中的数据完整性。
数据一致性: 通过定义校验规则,可以确保数据库中的数据保持一致性。例如,对于一个表示电子邮件地址的字段,通过校验规则可以防止存储无效的电子邮件地址。
提高系统安全性: 校验有助于防止恶意输入或不当输入的攻击。通过限制输入的范围和格式,可以减少安全风险。
减少错误和异常: 校验可以捕获并阻止不符合预期的数据输入,从而减少系统中的错误和异常。这有助于提高应用程序的稳定性和可靠性。
简化代码逻辑: 将数据验证放在模型定义中,可以在应用程序的不同部分共享相同的验证规则,避免重复的验证逻辑。
更好的代码可维护性: 使用 validate
校验将验证逻辑集中在模型中,使得更改验证规则更加方便和可维护。这样可以确保所有对模型的操作都遵循相同的验证规则。
2. 典型的使用场景
示例1: 验证用户名长度
设置模型的代码
const User = sequelize.define('User', {
username: {
type: Sequelize.STRING,
allowNull: false,
validate: {
len: {
args: [3, 20],
msg: 'Username must be between 3 and 20 characters long.',
},
},
},
});
在这个例子中,通过 validate
属性,设置了一个验证规则,要求 username
的长度在3到20个字符之间。
使用模型的代码
// 示例代码
// ...
// 尝试创建一个用户名过长的用户
try {
const newUser = await User.create({ username: 'toolongusernameforvalidation' });
} catch (error) {
console.error(error.message); // 输出错误信息
}
示例2: 验证邮箱格式
设置模型的代码
const User = sequelize.define('User', {
email: {
type: Sequelize.STRING,
allowNull: false,
validate: {
isEmail: {
msg: 'Invalid email format.',
},
},
},
});
在这个例子中,通过 validate
属性,使用内置的 isEmail
验证规则,要求 email
必须符合邮箱格式。
使用模型的代码
// 示例代码
// ...
// 尝试创建一个格式不正确的邮箱用户
try {
const newUser = await User.create({ email: 'invalidemail@com' });
} catch (error) {
console.error(error.message); // 输出错误信息
}
示例3: 验证密码强度
设置模型的代码
const User = sequelize.define('User', {
password: {
type: Sequelize.STRING,
allowNull: false,
validate: {
isStrongPassword: {
msg: 'Password must be at least 8 characters long and include uppercase, lowercase, and special characters.',
},
},
},
});
在这个例子中,通过 validate
属性,使用自定义的 isStrongPassword
验证规则,要求 password
必须包含大写、小写字母和特殊字符,并且长度至少为8个字符。
使用模型的代码
// 示例代码
// ...
// 尝试创建一个弱密码的用户
try {
const newUser = await User.create({ password: 'weakpass' });
} catch (error) {
console.error(error.message); // 输出错误信息
}
示例4: 验证日期范围
设置模型的代码
const Event = sequelize.define('Event', {
startDate: {
type: Sequelize.DATE,
allowNull: false,
validate: {
isAfter: {
args: new Date().toISOString(),
msg: 'Event start date must be in the future.',
},
},
},
});
在这个例子中,通过 validate
属性,使用内置的 isAfter
验证规则,要求 startDate
必须在当前日期之后。
使用模型的代码
// 示例代码
// ...
// 尝试创建一个过去的事件
try {
const newEvent = await Event.create({ startDate: '2022-01-01' });
} catch (error) {
console.error(error.message); // 输出错误信息
}
示例5: 验证唯一性
设置模型的代码
const Product = sequelize.define('Product', {
name: {
type: Sequelize.STRING,
allowNull: false,
unique: {
args: true,
msg: 'Product name must be unique.',
},
},
});
在这个例子中,通过 validate
属性,使用内置的 unique
验证规则,要求 name
必须是唯一的。
使用模型的代码
// 示例代码
// ...
// 尝试创建两个同名的产品
try {
const product1 = await Product.create({ name: 'Example Product' });
const product2 = await Product.create({ name: 'Example Product' }); // 这里会触发唯一性验证
} catch (error) {
console.error(error.message); // 输出错误信息
}
3. 常见内置规则
下面是一些常见的在 Sequelize 的 validate
属性中内置的校验规则:
is
:检查字段是否匹配指定的正则表达式。isEmail
:验证字段是否为有效的电子邮件地址。isURL
:验证字段是否为有效的URL。isIP
:验证字段是否为有效的IP地址。isIPv4
:验证字段是否为有效的IPv4地址。isIPv6
:验证字段是否为有效的IPv6地址。isAlpha
:验证字段是否只包含字母字符。isAlphanumeric
:验证字段是否只包含字母和数字字符。isNumeric
:验证字段是否只包含数字。isInt
:验证字段是否为整数。isFloat
:验证字段是否为浮点数。isDecimal
:验证字段是否为十进制数。isLowercase
:验证字段是否为小写字母。isUppercase
:验证字段是否为大写字母。isNull
:验证字段是否为 null
。notEmpty
:验证字段是否不为空。len
:验证字段的长度是否在指定范围内。isIn
:验证字段的值是否在指定数组中。notIn
:验证字段的值是否不在指定数组中。isDate
:验证字段是否为有效的日期。isAfter
:验证字段的日期是否在指定日期之后。isBefore
:验证字段的日期是否在指定日期之前。isUUID
:验证字段是否为有效的UUID。isCreditCard
:验证字段是否为有效的信用卡号码。isISBN
:验证字段是否为有效的ISBN。isJSON
:验证字段是否为有效的JSON字符串。isAscii
:验证字段是否为ASCII字符。isFullWidth
:验证字段是否包含全角字符。isHalfWidth
:验证字段是否包含半角字符。isVariableWidth
:验证字段是否包含可变宽度字符。