Sequelize,自定义setter,没有设置

Bre*_*ner 4 node.js sequelize.js

不幸的是,模型属性设置器和getter的文档有些不足,我无法让我的小二手工作.

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;
}
Run Code Online (Sandbox Code Playgroud)

现在从基于github的问题可以看出,属性上的自定义setter不会在create()上调用,所以调用

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

导致以下插入:

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');
Run Code Online (Sandbox Code Playgroud)

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

u.set('password', 'stupid');
u.save();
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

sde*_*old 13

您遇到此问题,因为getter和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);
        }
    }
})
Run Code Online (Sandbox Code Playgroud)