将属性添加到Sequelize FindOne返回的对象

Ras*_*amm 19 javascript postgresql sequelize.js

我试图将一个属性添加到sequelize实例,然后再将其传递回客户端.

router.get('/cats/1', function (req, res) {
    Cat.findOne({where: {id: 1}})
        .then(function (cat) {
            // cat exists and looks like {id: 1}
            cat.name = "Lincoln";
            // console.log of cat is {id: 1, name: Lincoln}
            res.json(cat);
        });
});
Run Code Online (Sandbox Code Playgroud)

客户端只看到{id: 1}而不是新添加的密钥.

  • 这里发生了什么?
  • Sequelize返回什么类型的Object?
  • 如何向我的猫添加新属性并将其发回?

Tom*_*ara 32

Sequelize Model类(你的猫是实例)有一个toJSON()方法,res.json可能会用来序列你的猫.该方法返回Model#get()(https://github.com/sequelize/sequelize/blob/95adb78a03c16ebdc1e62e80983d1d6a204eed80/lib/model.js#L3610-L3613)的结果,该结果仅使用模型上定义的属性.如果您希望能够在数据库中设置猫名​​称而不是商店名称,则可以在定义猫模型时使用虚拟列:

sequelize.define('Cat', {
  // [other columns here...]
  name: Sequelize.VIRTUAL
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想向模型定义添加属性:

cat = cat.toJSON(); // actually returns a plain object, not a JSON string
cat.name = 'Macavity';
res.json(cat);
Run Code Online (Sandbox Code Playgroud)

  • (还要记住,您所描述的内容听起来很像是一个计算字段。在模型上使用虚拟属性的好处是,您可以在该属性的get()中定义数学变换,这样,如果您从其他地方访问模型实例,而无需重新计算结果) (2认同)

Eri*_*ang 15

以下适用于续集v4。

...
const order = Order.findOne(criteria);
order.setDataValue('additionalProperty', 'some value');
...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。为时已晚,但万一人们还在寻找答案。

  • 惊人的。这绝对有帮助! (2认同)

7hi*_*ult 6

对我有用的是使用setDataValue

router.get('/cats/1', function (req, res) {
    Cat.findOne({where: {id: 1}})
        .then(function (cat) {
            cat.setDataValue("name", "Lincoln");
            res.json(cat);
        });
});
Run Code Online (Sandbox Code Playgroud)

功能规格

public setDataValue(key: string, value: any)

Update the underlying data value

Params:

Name    Type    Attribute   Description
key     string              key to set in instance data store   
value   any                 new value for given key
Run Code Online (Sandbox Code Playgroud)

来源:https ://sequelize.org/master/class/lib/model.js~Model.html#instance-method-setDataValue