sequelize getter 和 setter 是如何工作的?

Posted

技术标签:

【中文标题】sequelize getter 和 setter 是如何工作的?【英文标题】:How do sequelize getter and setters work? 【发布时间】:2014-03-23 20:38:53 【问题描述】:

问题摘要:从概念上讲,什么是 getter 和 setter,我们为什么要使用它们?

摘自http://docs.sequelizejs.com/en/latest/docs/models-definition/?highlight=getterMethods#getters-setters:

可以在模型上定义“对象属性”getter 和 setter 函数,它们既可以用于“保护”映射到数据库字段的属性,也可以用于定义“伪”属性。

    “保护”是什么意思?反对什么?

    什么是“伪”属性?

我也在为下面的示例代码而苦苦挣扎。我们似乎设置了两次“标题”。 'v' 的参数是什么?

见下文:

var Foo = sequelize.define('Foo', 
  title: 
    type     : Sequelize.STRING,
    allowNull: false,
  
, 

  getterMethods   : 
    title       : function()   /* do your magic here and return something! */ ,
    title_slug  : function()   return slugify(this.title); 
  ,

  setterMethods   : 
    title       : function(v)  /* do your magic with the input here! */ ,
  
);

非常感谢您提供一个具体的例子而不是“做魔术”!

【问题讨论】:

【参考方案1】:

伪属性

从用户的角度来看,这些属性似乎是对象的常规属性,但在数据库中不存在。以具有名字和姓氏字段的用户对象为例。然后你可以创建一个全名设置器:

var foo = sequelize.define('foo', 
    ..
, 
    getterMethods: 
        fullName: function () 
            return this.getDataValue('firstName') + ' ' + this.getDataValue('lastName')
        
    ,
    setterMethods: 
        fullName: function (value) 
            var parts = value.split(' ')

            this.setDataValue('lastName', parts[parts.length-1])
            this.setDataValue('firstName', parts[0]) // this of course does not work if the user has several first names
        
    
)

当你有一个用户对象时,你可以简单地做

console.log(user.fullName) 

查看用户的全名。然后在后台调用 getter。

同样,如果你为全名定义一个 setter 方法,你可以这样做

user.fullName = 'John Doe'

然后将传递的字符串分成两部分并将它们保存在名字和姓氏中。 (参见上面的简化示例)

保护属性

@ahipsa 已经提供了一个很好的例子。当您执行 user.toJSON() 时会调用 getter,因此您可以使用 getter 在将敏感数据发送给用户之前轻松删除它。

【讨论】:

一月,当我向 findAll options.attributes 添加一个伪属性时,它失败并说我的伪属性在数据库中不存在。这对我来说很有意义,但我认为 Sequelize 会知道这一点并为我处理它。这是预期的行为还是有办法选择伪属性?我想现在默认情况下包含每个伪属性...... 我很好奇 Sequelize 将如何处理异步 getter,因此我对其进行了测试,它无需任何额外工作就可以很好地工作。如果您为全名设置了一个 getter,例如 fullName: async function () ... ,然后使用 user.fullName 访问该属性,Sequelize 将正确处理生成的 Promise,而无需在访问该属性时使用 await。只是我会把它放在这里以防万一有人感兴趣。 很高兴看到User.getterMethods = function() fullname: etc 这种更面向对象的风格【参考方案2】:
@Column(
type: DataType.STRING,
set : function (this: User, value: string) 
  this.setDataValue("password", cryptService.hashSync(value));
  
)
password: string;

This is the snippet which is used to store hashed password in database in 
place of normal string.

【讨论】:

以上是关于sequelize getter 和 setter 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

为什么使用Getter和Setter?Getter和Setter有什么区别?

Python中的setter和getter

Dart中类的getter和setter

GroovyGroovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )

getter和setter

getter和setter