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

时间:2015-04-18 07:55:46

标签: javascript backbone.js bookshelf.js

以下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()所做的更改而不会导致保存/更改循环?

1 个答案:

答案 0 :(得分:2)

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

&#13;
&#13;
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;
&#13;
&#13;

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

&#13;
&#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;
&#13;
&#13;

希望这有助于某人: - )