Sequelize, custom setter, doesn't set

node.js, sequelize.js

Solution

You are experiencing this issue, because getters and setters are currently only support synchronous actions. Saying this, you can find a working solution here:

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

Problem

Unfortunatly the documentation for model property setters and getters is somewhat deficient and I'm having trouble getting my little setter to work. ``` 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; } ``` Now from what I can tell based on github issues custom setters on properties are not called on create() so calling ``` db.User.create( { username:'guest', email:'guest@guest', userlevel:1, password:'guest' } ).success( function(record) { console.log(record) }); ``` results in the following insert: ``` 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'); ``` so I went ahead and added the following in the success clause: ``` u.set('password', 'stupid'); u.save(); ``` I can see that my setter is getting properly called and that the hash is getting set on the password property. However once the setter ends and I return back to my u.save() line the u object is back to it's previous state with no password set. Any ideas?

Original source