【问题标题】:beforeUpdate doesn't seem to be calledbeforeUpdate 似乎没有被调用
【发布时间】:2018-03-27 06:31:24
【问题描述】:

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

'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 钩子似乎不起作用或被调用,并且密码以纯文本形式保存在数据库中。

它从何而来,如何解决?

【问题讨论】:

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


    【解决方案1】:

    您如何更新用户?获取用户实例并更新它和通过查询模型进行更新之间是有区别的。前者是 instance 更新,后者是 bulk 更新操作(即使您的 where 过滤器会返回单个项目)。

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

    【讨论】:

    • 看来你是对的,我用db.user.update(..., {where: {id: req.params.userId}});。非常感谢
    • 你能发布示例代码吗,因为我找不到实际的参数
    【解决方案2】:

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

    { individualHooks: true }
    

    注意:默认情况下,bulkCreate 等方法不会发出单独的挂钩 - 只有批量挂钩。但是,如果您还希望发出单个挂钩,则可以将 { individualHooks: true } 选项传递给查询调用。但是,这可能会极大地影响性能,具体取决于所涉及的记录数量(因为除其他外,所有实例都将加载到内存中)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2018-07-05
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多