Sequelize ORM 实践攻略:如何使用 Model 验证数据的正确性?

阅读时长 8 分钟读完

前言

Sequelize 是一个 Node.js 中广泛使用的 ORM 框架,它支持多种关系型数据库,并提供了丰富的功能、简单易用的 API。在实际开发中,我们需要针对不同的 Model(数据表)设计合适的验证方法,避免数据的不一致和安全问题。

本文将介绍如何使用 Sequelize Model 验证数据的正确性,让你的开发更加健壮、高效。

Model 的验证器

Sequelize 提供了强大的验证器,支持多种数据类型的验证,如字符串、数字、日期等。

在 Model 中定义字段时,可以通过在字段配置项中添加 validate 属性来指定数据验证器:

-- -------------------- ---- -------
-- ---- ---- -----
----- ---- - ------------------------ -
  --------- -
    ----- -----------------
    ---------- ------ -- -----
    ------- ----- -- -----
    --------- -
      --------- ----- -- -------
      ---- --- ---- -- ----- ---- --
    --
  --
  ---- -
    ----- ------------------
    --------- -
      ------ ----- -- -----
      ---- -- -- ---- -
    --
  --
  ------ -
    ----- -----------------
    --------- -
      -------- ----- -- --------
    --
  --
---

以上代码定义了一个 User Model,其中包含了三个字段:usernameageemail。对于每个字段,我们通过 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 上通过钩子函数来验证数据,它包括了 beforeValidatebeforeCreatebeforeUpdate,这些钩子函数会在数据保存之前执行。

在钩子函数中,我们可以通过抛出 sequelize.ValidationError 异常来中断保存数据的流程,并返回错误信息。

-- -------------------- ---- -------
----- ---- - ------------------------ -
  --------- -
    ----- -----------------
    ---------- ------
    ------- -----
    --------- -
      --------- -----
      ---- --- ----
    --
  --
  ---- -
    ----- ------------------
    --------- -
      ------ -----
      ---- --
    --
  --
  ------ -
    ----- -----------------
    --------- -
      -------- -----
    --
  --
-- -
  ------ -
    ------------- ----- ------ -- -
      --- -
        ----- ---------------- -- ----
      - ----- -------- -
        ----- --- ----------------------------------
      -
    --
  -
---

以上代码在 beforeCreate 钩子函数中,通过 user.validate 方法验证数据,并通过抛出 sequelize.ValidationError 异常来中断保存数据的流程。这样可以有效避免因数据验证不通过而导致的安全问题。

总结

本文介绍了 Sequelize ORM 中 Model 验证数据的正确性的方式,并详细讲解了数据验证器、验证方法和钩子函数等内容。在实际开发中,根据不同的业务需求和数据规模,我们可以灵活地运用这些技巧,提高数据的正确性和安全性。

为了更好地理解本文的内容,以下是完整的示例代码:

-- -------------------- ---- -------
----- - ---------- --------- - - ---------------------

----- --------- - --- -----------
  -------- ---------
  -------- -----------
---

----- ---- - ------------------------ -
  --------- -
    ----- -----------------
    ---------- ------
    ------- -----
    --------- -
      --------- -----
      ---- --- ----
    --
  --
  ---- -
    ----- ------------------
    --------- -
      ------ -----
      ---- --
    --
  --
  ------ -
    ----- -----------------
    --------- -
      -------- -----
    --
  --
-- -
  ------ -
    ------------- ----- ------ -- -
      --- -
        ----- ---------------- -- ----
      - ----- -------- -
        ----- --- ----------------------------------
      -
    --
  -
---

------ -- -- -
  ----- ---------------- ------ ---- --- -- -----

  -- ----------- ---- --
  ----- ---- - ----- -------------
    --------- ------
    ---- ---
    ------ --------------
  ---

  --- -
    ----- ---------------- -- ----
    ---------------------
  - ----- -------- -
    --------------------
  -

  --- -
    -------------------- -- ------
    ---------------------
  - ----- ------- -
    --------------------------
  -

  ----- -------- - ----- -------------
    --------- -----------
    ---- ---
    ------ -------------------
  ---

  -------------------------------
-----

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/652251a695b1f8cacd9bc4a5

纠错
反馈