beforeUpdate似乎没有被调用

时间:2017-10-15 18:14:49

标签: javascript node.js passwords hook sequelize.js

我有一个简单的用户模型如下:

'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挂钩似乎无法工作或被调用,密码以纯文本形式保存在数据库中。

它来自何处以及如何修复?

2 个答案:

答案 0 :(得分:7)

您如何更新用户?获取用户实例并更新它并通过查询模型进行更新之间存在差异。前者是实例更新,后者是批量更新操作(即使您的where过滤器会返回单个项目。)

这种区别很重要,因为beforeUpdateinstance hook所以它只会在实例更新时触发。您可以更改更新用户的方式,也可以实现beforeBulkUpdate挂钩。

答案 1 :(得分:0)

提供Unglückspilz答案的替代方法。您还可以添加选项

{ individualHooks: true }

注意:默认情况下,诸如bulkCreate之类的方法不会发出单个钩子-仅散装钩子。但是,如果您还希望发出单个钩子,则可以将{IndividualHooks:true}选项传递给查询调用。但是,这可能会严重影响性能,具体取决于所涉及的记录数(因为,除其他外,所有实例都将被加载到内存中)。

https://sequelize.org/master/manual/hooks.html#model-hooks