首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >beforeUpdate似乎没有被称为

beforeUpdate似乎没有被称为
EN

Stack Overflow用户
提问于 2017-10-15 18:14:49
回答 2查看 2.6K关注 0票数 7

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

代码语言:javascript
复制
'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钩子似乎无法工作或被调用,并且密码保存在数据库中的纯文本中。

,它是从哪里来的,如何修复?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-20 09:17:42

如何更新用户?获取用户实例与更新实例与通过查询模型进行更新是有区别的。前者是一个实例更新,后者是一个大容量更新操作(即使您的where过滤器将返回一个条目)。

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

票数 13
EN

Stack Overflow用户

发布于 2020-06-07 17:47:03

提供一个替代恩格卢克斯溢出的答案。还可以添加该选项。

代码语言:javascript
复制
{ individualHooks: true }

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46758407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档