2014-02-25 24 views
4

不幸的是,模型属性setters和getters的文档有点不足,我无法让我的小setter工作。续集,自定义setter,没有设置

var bcrypt = require('bcrypt'); 

module.exports = function(sequelize, DataTypes) 
{ 
    var User = sequelize.define('User', { 
     username:  { type:DataTypes.STRING, unique: true, allowNull: false }, 
     email:   { type:DataTypes.STRING, allowNull: false, unique: true }, 
     userlevel:  { type:DataTypes.INTEGER, allowNull:false, defaultValue:0 }, 
     password:  { type:DataTypes.STRING, 
      set: function(v) { 
       var pw = this; 
       var r; 
       bcrypt.genSalt(10, function(err,salt) { 
        bcrypt.hash(v, salt, function(err,hash) { 
         pw.setDataValue('password', hash); 
        }); 
       }); 
      } } 
    }); 



    return User; 
} 
从我可以告诉基于在github上

的问题,目前在属性自定义setters是不叫上创建(),因此调用

db.User.create({ username:'guest', email:'[email protected]', userlevel:1, password:'guest' }).success(function(record) { console.log(record) }); 

结果如下插入:

Executing (default): INSERT INTO `Users` (`id`,`username`,`email`,`userlevel`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'guest','[email protected]',100,'2014-02-25 01:05:17','2014-02-25 01:05:17'); 

所以我继续在成功条款中添加以下内容:

u.set('password', 'stupid'); 
u.save(); 

我可以看到我的setter被正确调用,并且哈希正在设置密码属性。然而,一旦setter结束并且我返回到我的u.save()行,u对象就会回到之前的状态,并且没有设置密码。

任何想法?

回答

12

您遇到此问题,因为getters和setter目前仅支持同步操作。说这句话的,你可以在这里找到工作的解决方案:

var User = sequelize.define('User', { 
    username:  { type: DataTypes.STRING, allowNull: false, unique: true }, 
    email:   { type: DataTypes.STRING, allowNull: false, unique: true }, 
    userlevel:  { type: DataTypes.INTEGER, allowNull:false, defaultValue:0 }, 
    password:  { 
     type: Sequelize.STRING, 
     set: function(v) { 
      var salt = bcrypt.genSaltSync(10); 
      var hash = bcrypt.hashSync(v, salt); 

      this.setDataValue('password', hash); 
     } 
    } 
}) 
+1

钩/为Sequelize生命周期事件是异步,连同.changed()一次可实现的哈希在一个钩,如果密码字段已经改变。 –

+0

它是否在文档中说getter和setter是同步的?我很乐意能够责备自己,只是为了快速阅读而不是浪费一个小时的时间戳这个问题。 –

+1

事实上,当涉及到getters/setter时,文档是超级丑陋的。我们将致力于此。 – sdepold