【问题标题】:manipulate data object sequelize ORM (nodejs)操作数据对象 sequelize ORM (nodejs)
【发布时间】:2019-10-16 12:27:06
【问题描述】:

我有类似的代码:

data = await photo.findOne({
    where : {id}
})

返回数据

{
     "a" : 2,
     "b" : 5
}

我想像插入一些字段一样操作数据

所以我添加属性:

data.c = data.a * data.b

我在 console.log 中检查添加的数据

{
     "a" : 2,
     "b" : 5,
     "c" " 10
}

但是当我返回 json 时

 return res.status(200).json({message: "success", data })

数据还是第一个 { “a2, “乙”:5 }

【问题讨论】:

  • 当你使用 sequelize 时,你写入一个表。所以首先是检查表结构。你有一个列'c'吗? ORM 架构如何以及如何保存数据?
  • 不,我没有列“c”,但我想将一些属性“c”添加到对象“数据”
  • 我现在明白你想要做什么了。我猜你的问题是时间问题。异步代码未按您认为的顺序执行的东西。

标签: node.js express sequelize.js


【解决方案1】:

你的问题的原因是

Finder 方法旨在从数据库中查询数据。它们不返回普通对象,而是返回模型实例。因为 finder 方法返回模型实例,所以您可以在结果上调用任何模型实例成员,如实例文档中所述。

当您 data.c = data.a * data.b 执行此操作时,您基本上是将属性添加到模型实例而不是数据对象

你可以做类似的事情

dataInstance = await photo.findOne({
    where : {id}
})
data = dataInstance.get({
   plain: true // Important
})
data.c = data.a * data.b;

干杯。不要忘记验证答案。

【讨论】:

  • 哇,我明白了,我对模型有误解,但是当我尝试时,为什么返回“dataInstance.get 不是函数”
  • 答案是正确的,感谢我得到错误“dataInstance.get 不是函数”的原因,因为数据仍在数组中,我使用 .findAll()
【解决方案2】:

经过大量搜索,我终于找到了答案。你应该这样做

const users = await db.users.findAll({})
.map(el => el.get({ plain: true })) // add this line to code

来源:Github issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2010-10-15
    • 2016-01-29
    • 2018-12-23
    • 2015-06-16
    • 2020-09-07
    相关资源
    最近更新 更多