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

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

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

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

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

  2. 什么是“伪”属性?

我也在为下面的示例代码而苦苦挣扎。我们似乎设置了两次“标题”。 '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! */ },
  }
});

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

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案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.
    

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 2022-11-05
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多