前言
Sequelize 是一个 Node.js 中广泛使用的 ORM 框架,它支持多种关系型数据库,并提供了丰富的功能、简单易用的 API。在实际开发中,我们需要针对不同的 Model(数据表)设计合适的验证方法,避免数据的不一致和安全问题。
本文将介绍如何使用 Sequelize Model 验证数据的正确性,让你的开发更加健壮、高效。
Model 的验证器
Sequelize 提供了强大的验证器,支持多种数据类型的验证,如字符串、数字、日期等。
在 Model 中定义字段时,可以通过在字段配置项中添加 validate
属性来指定数据验证器:
-- -------------------- ---- ------- -- ---- ---- ----- ----- ---- - ------------------------ - --------- - ----- ----------------- ---------- ------ -- ----- ------- ----- -- ----- --------- - --------- ----- -- ------- ---- --- ---- -- ----- ---- -- -- -- ---- - ----- ------------------ --------- - ------ ----- -- ----- ---- -- -- ---- - -- -- ------ - ----- ----------------- --------- - -------- ----- -- -------- -- -- ---
以上代码定义了一个 User Model,其中包含了三个字段:username
、age
、email
。对于每个字段,我们通过 validate
属性配置了不同的数据验证器。
其中常用的验证器包括:
- notEmpty: 字符串不能为空;
- len: 字符串或数组长度必须在指定区间内;
- isInt: 必须为整数;
- min/max: 最小/最大值;
- isEmail: 必须符合邮箱格式;
- isUrl: 必须符合 URL 格式;
- isAlpha: 必须为字母;
- isAlphanumeric: 必须为字母或数字;
- isNumeric: 必须为数字;
- isDate: 必须为日期格式;
- isAfter/isBefore: 在指定日期之后/之前;
- isUUID: 必须符合 UUID 格式;
更多验证器可参考官方文档:Validations
验证方法
除了在 Model 中直接声明验证器,Sequelize 还提供了多种对数据进行验证的方式。
1. validate 方法
Model 实例上通过 validate
方法可以对指定字段的值进行验证,它会返回一个 Promise,验证成功时会返回 null
,否则会返回一个包含错误信息的数组。
-- -------------------- ---- ------- ----- ---- - ----- ------------- --------- ------ ---- --- ------ -------------- --- --- - ----- ---------------- -- ---- --------------------- - ----- -------- - -------------------- -
以上代码通过 User.create
方法创建了一个包含错误数据的 User 实例,然后通过 validate
方法进行验证。由于 username
不符合长度要求,所以会输出一个包含错误信息的数组。
2. validateSync 方法
与 validate
类似,validateSync
方法可以同步验证数据,如果失败则会抛出异常。可以使用 try-catch
来捕获错误信息。
-- -------------------- ---- ------- ----- ---- - ----- ------------- --------- ------ ---- --- ------ -------------- --- --- - -------------------- -- ------ --------------------- - ----- ------- - -------------------------- -
3. beforeValidate/beforeCreate/beforeUpdate 钩子函数
Sequelize 也支持在 Model 上通过钩子函数来验证数据,它包括了 beforeValidate
、beforeCreate
、beforeUpdate
,这些钩子函数会在数据保存之前执行。
在钩子函数中,我们可以通过抛出 sequelize.ValidationError
异常来中断保存数据的流程,并返回错误信息。
-- -------------------- ---- ------- ----- ---- - ------------------------ - --------- - ----- ----------------- ---------- ------ ------- ----- --------- - --------- ----- ---- --- ---- -- -- ---- - ----- ------------------ --------- - ------ ----- ---- -- -- -- ------ - ----- ----------------- --------- - -------- ----- -- -- -- - ------ - ------------- ----- ------ -- - --- - ----- ---------------- -- ---- - ----- -------- - ----- --- ---------------------------------- - -- - ---
以上代码在 beforeCreate
钩子函数中,通过 user.validate
方法验证数据,并通过抛出 sequelize.ValidationError
异常来中断保存数据的流程。这样可以有效避免因数据验证不通过而导致的安全问题。
总结
本文介绍了 Sequelize ORM 中 Model 验证数据的正确性的方式,并详细讲解了数据验证器、验证方法和钩子函数等内容。在实际开发中,根据不同的业务需求和数据规模,我们可以灵活地运用这些技巧,提高数据的正确性和安全性。
为了更好地理解本文的内容,以下是完整的示例代码:
-- -------------------- ---- ------- ----- - ---------- --------- - - --------------------- ----- --------- - --- ----------- -------- --------- -------- ----------- --- ----- ---- - ------------------------ - --------- - ----- ----------------- ---------- ------ ------- ----- --------- - --------- ----- ---- --- ---- -- -- ---- - ----- ------------------ --------- - ------ ----- ---- -- -- -- ------ - ----- ----------------- --------- - -------- ----- -- -- -- - ------ - ------------- ----- ------ -- - --- - ----- ---------------- -- ---- - ----- -------- - ----- --- ---------------------------------- - -- - --- ------ -- -- - ----- ---------------- ------ ---- --- -- ----- -- ----------- ---- -- ----- ---- - ----- ------------- --------- ------ ---- --- ------ -------------- --- --- - ----- ---------------- -- ---- --------------------- - ----- -------- - -------------------- - --- - -------------------- -- ------ --------------------- - ----- ------- - -------------------------- - ----- -------- - ----- ------------- --------- ----------- ---- --- ------ ------------------- --- ------------------------------- -----
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/652251a695b1f8cacd9bc4a5