gpt4 book ai didi

javascript - Bookshelf js模型导致保存/更改循环

转载 作者:行者123 更新时间:2023-11-30 16:56:03 24 4
gpt4 key购买 nike

以下 Bookshelf 模型在保存模型时对用户密码进行哈希处理,唯一的问题是如果我将 model.set() 调用更改为 model.save() 它进入无限保存/更改循环。

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() 所做的更改?

最佳答案

事实证明模型在 hash_password 方法返回值之前正在保存,所以我 promise bcrypt 代码如下:

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

并完全重构模型的构造函数以使用它:

constructor: function() {
var self = this;
bookshelf.Model.apply(this, arguments);

this.on('saving', function(model) {
if(!model.attributes.password) {
delete model.attributes.password;
} else {
return self.hashPassword(model.attributes.password)
.then(function(hash) {
model.set({ password: hash });
});
}
});
}

希望这对某人有帮助:-)

关于javascript - Bookshelf js模型导致保存/更改循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29714576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com