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有什么区别?
GroovyGroovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )