Sequelize,自定义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问题自定义setter属性不调用create()调用

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

导致下面的插入:

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

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

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

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

有任何想法吗?

您遇到此问题,因为获取者和设置者目前仅支持同步操作。 说这个,你可以在这里find一个工作的解决scheme:

 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); } } })