Sequelize:记录中的数字(dataValues)只有在 JSON 序列化期间发挥作用
Sequelize 是一个在 Node.js 上操作数据库的 ORM 框架,并且支持多种 SQL 数据库,如 MySQL、PostgreSQL 和 SQLite 等。在使用 Sequelize 期间,您可能会遇到一个问题,那就是数据记录中的数字只有在 JSON 序列化期间才会发挥作用。
什么是 dataValues?
在 Sequelize 中,每个数据记录将包含一个表示该记录的对象。该对象上的字段是直接从数据库加载的,即使您在模型定义时指定了 getter、setter 或默认值,它们都不会被加载。这个对象叫做 dataValues。如果您想使用模型定义中定义的 getter、setter 或默认值,那么您应该使用 get
、set
和 getDataValue
方法。这些方法可以用于读取和设置属性值。
-- -------------------- ---- ------- ----- ---- - ------------------------ - ---------- - ----- ----------------- ---------- ----- -- --------- - ----- ----------------- ---------- ----- -- --------- - ----- ------------------ ----- - ------ ------------------ ------------------ - - --- -- -------- - ---- ------ ----- ---- - ----- -------------- ------ - --- - - --- ------------------ -- - --- -- ---------- ------- --------- ----- - --------------------------- -- ----- ---- ------------------------------------------- -- ----- ----
为什么 dataValues 只有在 JSON 序列化期间才有效?
在 Express 应用程序的许多响应中,您可能会将数据库记录发送到客户端并将其呈现为 JSON。这是一个常见的场景。例如:
// Retrieve a user record const user = await User.findOne({ where: { id: 1 } }); // Send the user record to the client as JSON res.json(user);
在这个例子中,您可能会期望收到包含 fullName
属性的 JSON 对象。但是,实际上您只会得到通过模型定义直接加载的属性对象。为什么?
数据记录对象在向客户端发送 JSON 时,Express 使用 JSON.stringify
方法。JSON.stringify
方法只能在数据记录对象上输出可枚举的属性。而 dataValues
对象上的属性是不可枚举的,因此它们不会在 JSON 序列化期间输出。
然而,当您使用 toJSON
方法返回 JSON 数据时,请注意,dataValues
对象上的属性将被序列化输出,因为默认情况下,toJSON
方法只保留可枚举的属性。
-- -------------------- ---- ------- ----- ---- - ------------------------ - ---------- - ----- ----------------- ---------- ----- -- --------- - ----- ----------------- ---------- ----- -- --------- - ----- ------------------ ----- - ------ ------------------ ------------------ - - -- - ------- - --------- ---- - --- -- -------- - ---- ------ ----- ---- - ----- -------------- ------ - --- - - --- -- ---- --- ---- ------ -- --- ------ -- ---- ---------------
总结
在使用 Sequelize 期间,使用 dataValues
对象上的属性是一种非常方便的方法,但它们只有在 JSON 序列化期间才会发挥作用。如果您需要使用模型定义中定义的 getter、setter 或默认值,请使用 get
、set
和 getDataValue
方法。如果您需要将数据库记录作为 JSON 输出到客户端,请使用 toJSON
方法并将 virtuals
选项设置为 true
。
示例代码
-- -------------------- ---- ------- ----- --------- - --------------------- ----- ------- - ------------------- ----- --------- - --- --------------------- ----------- ----------- - -------- --------- -------- ----------------- --- ----- ---- - ------------------------ - ---------- - ----- ----------------- ---------- ----- -- --------- - ----- ----------------- ---------- ----- -- --------- - ----- ------------------ ----- - ------ ------------------ ------------------ - - -- - ------- - --------- ---- - --- ------ -- -- - ----- ----------------- ----- --- - ---------- ----------------- ----- ----- ---- -- - ----- ----- - ----- --------------- ---------------- --- ----------------- -----
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6491016448841e9894f028fa