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 返回的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize:在 findAll 中包含连接表属性包括

Sequelize 普通对象返回空 - 花括号行为不端

Sequelize - 自我引用有很多关系

如何使用 Jackson 在对象中包含原始 JSON?

如何在 json 对象中包含表名

在 GeoJson 对象中包含 JSON 流?