Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js sequelize getter和setter如何工作?_Node.js_Sequelize.js - Fatal编程技术网

Node.js sequelize getter和setter如何工作?

Node.js sequelize getter和setter如何工作?,node.js,sequelize.js,Node.js,Sequelize.js,问题摘要:从概念上讲,什么是getter和setter,我们为什么要使用它们 摘录自: 可以在模型上定义“对象属性”getter和setter函数,这些函数既可以用于“保护”映射到数据库字段的属性,也可以用于定义“伪”属性 “保护”是什么意思?反对什么 什么是“psuedo”属性 我也在努力处理下面的示例代码。我们似乎设置了两次“标题”。什么是论点“v” 见下文: var Foo = sequelize.define('Foo', { title: { type : Sequ

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

摘录自:

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

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

  • 什么是“psuedo”属性

  • 我也在努力处理下面的示例代码。我们似乎设置了两次“标题”。什么是论点“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! */ },
      }
    });
    
    如果您能举一个具体的例子而不是“施展魔法”,我们将不胜感激

    伪属性

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

    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'
    
    然后将传递的字符串拆分为两部分,并以名字和姓氏保存它们。(参见上面的简化示例)

    保护财产


    @阿希普萨已经提供了一个很好的例子。执行user.toJSON()操作时会调用getter,因此可以使用getter轻松删除敏感数据,然后再将其发送给用户。

    Jan,当我向findAll options.attributes添加伪属性时,它会失败,并说数据库中不存在我的伪属性。这对我来说很有意义,但我认为Sequelize会知道这一点并为我处理它。这是预期行为还是有办法选择psuedo属性?我想现在每个伪属性都默认包含了……我很好奇Sequelize将如何处理异步getter,所以我测试了它,它在没有任何额外工作的情况下工作得很好。如果为全名设置getter,如
    fullName:async function(){…}
    ,然后使用
    user.fullName
    访问属性,Sequelize将正确处理生成的承诺,而无需在访问属性时使用
    wait
    。虽然我会把它放在这里,以防有人感兴趣。如果能用更面向对象的
    User.getterMethods=function(){fullname:etc}
    @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.