node.js - 如何让 sequelize getter 与 findAll 一起使用

标签 node.js sequelize.js

例如,我有一个非常简单的模型:

const Blog = sequelize.define(
  'Blog',
  {
    id: {
      type: DataTypes.STRING,
      primaryKey: true,
      allowNull: false,
      get() {
        return this.getDataValue('id').toString();
      }
    },
  },
)
我想将我的记录作为字符串返回 id,但它不起作用:
const blogs = Blog.findAll({ raw: true })
console.log(blogs)
返回带有 id 属性作为数字的博客列表。
任何想法为什么,如果这不是正确的方法,那会是什么?

最佳答案

如果您想为主键使用不同的类型,请确保设置 autoIncrement: false 。通常,您将使用 DataTypes.INTEGERDataTypes.UUID 作为主键类型,但也应使用 DataTypes.String。您需要为每一行插入一个唯一值。
如果要运行 getter,则需要删除 raw: true 。当您指定原始结果时,从数据库返回的列将直接映射到 JSON 对象,在这种情况下它们是数字。如果您想将结果映射回普通 JSON 对象而不是模型实例,您可以使用 Array.map()Instance.toJSON()
请注意,在您的示例中,您还省略了 await 或 thenable 语法,这是异步获取结果所必需的。

const blogs = await Blog.findAll();
const plainObjs = blogs.map((blog) => blog.toJSON());

关于node.js - 如何让 sequelize getter 与 findAll 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64266544/

相关文章:

linux - 如何在启动时运行 shell 脚本

macos - 解压后无法在 MacOS Darwin 构建上访问 Electron-Forge SQLite3 数据库

node.js - 使用 async 和 find 方法进行 Sequelize

node.js - Order by 自定义模型中定义的字段属于多个关联。同时选择几个字段

javascript - 如前所述将带有文件路径的数组转换为对象

node.js - Sequelize 如何删除关联表中的事件

sql - 从sequelize.js 中的关联模型加载属性

node.js - Mongodb NodeJS驱动程序skip()不起作用

sequelize.js - Sequelize - 如何添加/更新插入具有软删除行相同主键的行

node.js - 使用 sequelize 迁移将关联添加到非默认模式