Sequelize:记录中的数字(dataValues)只有在 JSON 序列化期间发挥作用

阅读时长 6 分钟读完

Sequelize:记录中的数字(dataValues)只有在 JSON 序列化期间发挥作用

Sequelize 是一个在 Node.js 上操作数据库的 ORM 框架,并且支持多种 SQL 数据库,如 MySQL、PostgreSQL 和 SQLite 等。在使用 Sequelize 期间,您可能会遇到一个问题,那就是数据记录中的数字只有在 JSON 序列化期间才会发挥作用。

什么是 dataValues?

在 Sequelize 中,每个数据记录将包含一个表示该记录的对象。该对象上的字段是直接从数据库加载的,即使您在模型定义时指定了 getter、setter 或默认值,它们都不会被加载。这个对象叫做 dataValues。如果您想使用模型定义中定义的 getter、setter 或默认值,那么您应该使用 getsetgetDataValue 方法。这些方法可以用于读取和设置属性值。

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

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

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

为什么 dataValues 只有在 JSON 序列化期间才有效?

在 Express 应用程序的许多响应中,您可能会将数据库记录发送到客户端并将其呈现为 JSON。这是一个常见的场景。例如:

在这个例子中,您可能会期望收到包含 fullName 属性的 JSON 对象。但是,实际上您只会得到通过模型定义直接加载的属性对象。为什么?

数据记录对象在向客户端发送 JSON 时,Express 使用 JSON.stringify 方法。JSON.stringify 方法只能在数据记录对象上输出可枚举的属性。而 dataValues 对象上的属性是不可枚举的,因此它们不会在 JSON 序列化期间输出。

然而,当您使用 toJSON 方法返回 JSON 数据时,请注意,dataValues 对象上的属性将被序列化输出,因为默认情况下,toJSON 方法只保留可枚举的属性。

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

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

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

总结

在使用 Sequelize 期间,使用 dataValues 对象上的属性是一种非常方便的方法,但它们只有在 JSON 序列化期间才会发挥作用。如果您需要使用模型定义中定义的 getter、setter 或默认值,请使用 getsetgetDataValue 方法。如果您需要将数据库记录作为 JSON 输出到客户端,请使用 toJSON 方法并将 virtuals 选项设置为 true

示例代码

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

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

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

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

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

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

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

纠错
反馈