我正在使用bookshelf-modelBase来为用户类建模。
在将密码保存到数据库之前,我想要salt密码,但我也想验证其长度是否短于给定的限制。因此,在模型'initialize'中,我在'saving'事件中添加了一个监听器,以便在保存之前加密密码。我还添加了一个'validate'块来检查Joi的密码长度。
问题是,当密码已经被腌制并且已经超过限制时,bookshelf-modelBase添加的验证侦听器在我的侦听器之后被调用。我试图取消绑定验证侦听器,但它不起作用。它总是在我之后称它为一切。
在我当前的模型定义之下。
var User = modelBase.extend({
tableName: 'users',
initialize: function() {
this.removeListener('saving', this.validateSave);
this.on('saving', this.validateAndProcessPassword);
},
validate: {
username: Joi.string().min(6).max(15),
password: Joi.string().max(15)
},
validateAndProcessPassword: function(model, attrs, options) {
this.validateSave(model, attrs, options);
const salt = bcrypt.genSaltSync();
var password = bcrypt.hashSync(this.get('password'), salt);
this.set({password: password});
}
});
上面的代码将调用validateSave两次。进入我的validateAndProcessPassword后一次。
那么,我如何对用户输入执行验证并仍保存盐渍密码?