【问题标题】:Sequelize "raw = true" changes json model attribute name with dotSequelize "raw = true" 用点更改 json 模型属性名称
【发布时间】:2020-10-07 00:52:18
【问题描述】:

我有 Content 模型,它有很多子 ContentImage 项目,像这样;

const content = await db.Content.findOne({
    where: {
        permalink: req.params.permalink
    },
    include: [{
        model: db.ContentImages
    }]
    raw: true
});

如您所知raw:true 将 SequelizeInstance 隐蔽到对象模型。在这一点上我有一些问题。

如果我使用raw:true,json 模型会这样显示;

{
  "id": 4706,
  "name": "Content Title",
  "content": "Content detail",
  "t_content_images.id": 7633,
  "t_content_images.content_id": 4706,
  "t_content_images.image": "content-image-1.jpg",
  "t_content_images.order_no": 1
}

因为expressjs,我需要like这个模型而不是SequelizeInstance;

{
  "id": 4706,
  "name": "Content Title",
  "content": "Content detail",
  "t_content_images": {
    "id": 7633,
    "content_id": 4706,
    "image": "content-image-1.jpg",
    "order_no": 1
  }
}

另一个问题,我有多个内容图像,如果我使用上面的第一个示例,它只返回第一个内容图像。

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    您的想法有点倒退 - 当您使用 raw: true 时,它不会将其从 JSON 对象转换为模型实例。

    如果您考虑 SQL 结果的结构,它们总是平淡无奇。这意味着对于有一个基本记录链接到多个子项(在本例中为Content -< ContentImages)的连接,SQL 结果将为每个子项重复基本记录的信息。 Sequelize 会将其解析为 JSON 对象,这就是您在问题的第一个示例中看到的内容。如果您遗漏了raw: true,那么它将更进一步,并将其解析为您的模型实例。然后,您可以调用Model.toJSON() 来获取已解析对象的 JSON 表示形式。

    鉴于上述情况,如果您要获取大量子项,那么将数据放入两个查询而不是一个查询会更有效,这样您就不必将重复数据发送给客户端。

    【讨论】:

    • "然后您可以调用 Model.toJSON() 来获取已解析对象的 JSON 表示。"这解决了我的问题。它将 SequelizeInstance 转换为 JSON 对象。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2012-01-18
    • 2019-05-09
    • 2019-12-10
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多