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)
| 归档时间: |
|
| 查看次数: |
5122 次 |
| 最近记录: |