对于nodejs来说还是一个新手,所以我经常被整个异步事件绊倒。我试图在使用bcrypt和bookshelf将密码存储到数据库之前对密码进行哈希处理。挺直的吧......
我正在调用保存动作,
create(data) {
this.logger.info(`creating account`);
return bookshelf.transaction(trx => {
return new Account().save(data, { method: 'insert', transacting: trx });
});
}
在帐户模型中,我拦截了保存操作
initialize: function() {
let _this = this;
const saltRounds = 10;
_this.on('creating', function () {
bcrypt.genSaltSync(saltRounds, function(err, salt) {
bcrypt.hashSync(_this.get('password'), salt, function (err, hash) {
if (err) throw err;
_this.set('password', hash);
});
});
});
}
到目前为止,我所查找的所有内容都说这应该可行,但纯文本密码仍会保存到数据库中而不是哈希密码。我做错了什么?
答案 0 :(得分:1)
你正在使用同步函数,但是传递它们不会被调用的回调(因此,密码不会被替换)。
试试这个:
initialize: function() {
const saltRounds = 10;
this.on('creating', () => {
let salt = bcrypt.genSaltSync(saltRounds);
let hash = bcrypt.hashSync(this.get('password'), salt);
this.set('password', hash);
});
}
使用promises(bcrypt
和bookshelf
都支持)替换异步函数同步函数:
initialize: function() {
const saltRounds = 10;
this.on('creating', () => {
return bcrypt.genSalt(saltRounds).then(salt => {
return bcrypt.hash(this.get('password'), salt);
}).then(hash => {
this.set('password', hash);
});
});
}
答案 1 :(得分:0)
我不确定,但我相信错误是因为你使用es6 let而不是var 那么这个背景将推迟