我有一个简单的用户模型如下:
'use strict';
let hashPassword = (user, options) => {
if (!user.changed('password')) { return; }
return require('bcrypt')
.hash(user.getDataValue('password'), 10)
.then(hash => user.setDataValue('password', hash));
};
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
username: {allowNull: false, type: DataTypes.STRING, unique: true},
email: {allowNull: false, type: DataTypes.STRING, unique: true},
password: {allowNull: false, type: DataTypes.STRING, unique: false},
}, {
hooks: {
beforeCreate: hashPassword,
beforeUpdate: hashPassword
}
});
return User;
};
它在用户创建方面非常有效,但beforeUpdate
挂钩似乎无法工作或被调用,密码以纯文本形式保存在数据库中。
它来自何处以及如何修复?
答案 0 :(得分:7)
您如何更新用户?获取用户实例并更新它并通过查询模型进行更新之间存在差异。前者是实例更新,后者是批量更新操作(即使您的where
过滤器会返回单个项目。)
这种区别很重要,因为beforeUpdate
是instance hook所以它只会在实例更新时触发。您可以更改更新用户的方式,也可以实现beforeBulkUpdate
挂钩。
答案 1 :(得分:0)
提供Unglückspilz答案的替代方法。您还可以添加选项
{ individualHooks: true }
注意:默认情况下,诸如bulkCreate之类的方法不会发出单个钩子-仅散装钩子。但是,如果您还希望发出单个钩子,则可以将{IndividualHooks:true}选项传递给查询调用。但是,这可能会严重影响性能,具体取决于所涉及的记录数(因为,除其他外,所有实例都将被加载到内存中)。