Sequelize - 在普通对象中包含 getter 返回
Posted
技术标签:
【中文标题】Sequelize - 在普通对象中包含 getter 返回【英文标题】:Sequelize - include getter returns in plain object 【发布时间】:2019-07-30 12:37:01 【问题描述】:我定义了一个 Sequelize 类,其中定义了一些虚拟字段,如下所示:
class Post extend Sequelize.Model
get age ()
return duration(this.get('createdAt'), new Date()).days
(为简洁起见,我跳过了实际的数据库字段)
我正在运行一个 Express 应用程序,我希望将这些虚拟字段发送到客户端。当我调用post.get( plain: true )
时,只有“真正的”数据库字段通过。我得到这样的东西:
"createdAt": "2019-03-05T09:16:50.391Z"
使响应更像这样的最佳方法是什么?:
"createdAt": "2019-03-07T09:16:50.391Z", "age": 3
【问题讨论】:
【参考方案1】:是否有理由扩展模型?使用 getterMethods 属性似乎可以满足您的要求。例如:
sequelizeDB.define('my_printer_table',
printer_code : type: Sequelize.STRING,primaryKey: true,
printer_name : Sequelize.STRING
,
getterMethods:
description()
return this.printer_code + ' ' + this.printer_name
);
然后,printer.get() 结果:
Object description: "ABC ABC Printing", printer_code: "ABC", printer_name: "ABC Printing"
【讨论】:
我扩展了模型,因为这就是这个特定应用程序中所有模型的编写方式(这种风格:codewithhugo.com/using-es6-classes-for-sequelize-4-models)。它是在一个高度基于对象且包含大量 ES6 的项目中,并且需要保持一致性。【参考方案2】:我最终采用的解决方案是在选项中显式声明 getter,类似于 KenOn10 的建议,但使用 ES6 语法。这是完成的解决方案:
class Post extend Sequelize.Model
static init (sequelize, DataTypes)
return super.init(
'age':
type: DataTypes.VIRTUAL,
get: function () return this.getAge()
, sequelize
getAge ()
return duration(this.get('createdAt'), new Date()).days
有几点需要注意:
我已将 getter 函数更改为名为getAge()
的普通函数,因为在架构中设置 get
属性也会将其创建为 getter。因此,如果您在该函数中调用 getter,它会进入递归循环并填满堆栈。
get
选项需要定义为完整函数,因为箭头函数没有自己的 this
上下文。
【讨论】:
以上是关于Sequelize - 在普通对象中包含 getter 返回的主要内容,如果未能解决你的问题,请参考以下文章