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对象就会回到之前的状态,并且没有设置密码。
任何想法?
钩/为Sequelize生命周期事件是异步,连同.changed()一次可实现的哈希在一个钩,如果密码字段已经改变。 –
它是否在文档中说getter和setter是同步的?我很乐意能够责备自己,只是为了快速阅读而不是浪费一个小时的时间戳这个问题。 –
事实上,当涉及到getters/setter时,文档是超级丑陋的。我们将致力于此。 – sdepold