首页 > 解决方案 > 如何在express中添加要通过sequelize对象传递的其他属性

问题描述

因此,例如,我有一个续集模型,如下所示:

// MyModel.js
module.exports = (sequelize, DataTypes) => {
  const MyModel = sequelize.define('MyModel',{
      foo: DataTypes.STRING,
  });

  return MyModel
}

然后我使用这个模型来表达使用控制器的模板引擎,如下所示:

app.get('/foobar',async function(req,res,next){
    var myModel = await MyModel.findById('abcd1234');
    myModel.bar = bar
    return res.render('foobar',{
       myModel: myModel
    });
})

foobar.pug是这样的:

html
   #{JSON.stringify(myModel)}

显然我可以找到名为的字段foo,但我无法获得名为的字段bar,我如何通过我的模型从我的控制器传递这个额外的计算字段?

标签: expresspugsequelize.js

解决方案


这背后的原因是:

var myModel = await MyModel.findById('abcd1234'); 
// will return an instance of MyModel not json

// So you can't just do
myModel.bar = bar;

实现它(将实例转换为 JSON 对象)

var myModel = await MyModel.findById('abcd1234').toJSON();
// Now this will return the JSON object and not instance of MyModel 

// Now this will work
myModel.bar = bar;

toJSON()是 sequelizejs 的模型方法,你也可以通过 javascript 函数转换它。

如果要保留 sequelize 对象,请将其保留在不同的变量中

var myModelInstance = await MyModel.findById('abcd1234');

var myModel = myModelInstance.get({plain: true});
// OR
var myModel = myModelInstance.toJSON();

// Now this will work
myModel.bar = bar;

这些是可能的做法,但由于缺乏要求和代码,这是我能建议的最好方法,如果您需要实例中的额外字段,您仍然可以查看GETTER 。


推荐阅读