以下Bookshelf模型在保存模型时会对用户密码进行哈希处理,唯一的问题是,如果我将model.set()
调用更改为model.save()
,则会进入无限保存/更改循环。< / p>
var User = bookshelf.Model.extend({
tableName: 'users',
hasTimestamps: true,
constructor: function() {
var self = this;
bookshelf.Model.apply(this, arguments);
this.on('saving', function(model) {
if(!model.get('password')) {
return self.hashPassword(model);
}
});
},
hashPassword: function(model) {
bcrypt.genSalt(10, function(error, salt) {
bcrypt.hash(model.attributes.password, salt, function(error, hash) {
model.set({password: hash});
console.log(model.attributes);
});
});
}
});
我知道Backbone有一个silent: true
选项可以传递,以便save()
不会触发更改的事件,但我认为Bookshelf不支持它。
如何保存model.set()
所做的更改而不会导致保存/更改循环?
答案 0 :(得分:2)
所以事实证明在hash_password方法返回一个值之前模型正在保存,所以我保证了bcrypt代码如下:
Prelude Text.XML.HXT.Core> let bars = replicate 3 (eelem "bar")
Prelude Text.XML.HXT.Core> runX $ xshow $ foldl (+=) (eelem "foo") bars
["<foo><bar/><bar/><bar/></foo>"]
&#13;
并完全重构模型的构造函数以使用它:
hashPassword: function(password) {
return new Promise(function(resolve, reject) {
bcrypt.genSalt(10, function(error, salt) {
if(error) return reject(error);
bcrypt.hash(password, salt, function(error, hash) {
if(error) return reject(error);
return resolve(hash);
});
});
});
}
&#13;
希望这有助于某人: - )