续写打字稿@BeforeUpdate Hook不起作用

时间:2019-11-29 08:16:52

标签: sequelize.js sequelize-typescript

我将Sequelize Typescript模块用于无服务器lambda函数。用户模型有两个钩子,beforecreate和beforeupdate。用户模型如下所示:

import { Table, Column, ForeignKey, BeforeCreate, BeforeUpdate, BelongsTo } from 'sequelize-typescript';
import { Role } from './role';
import bcrypt from 'bcrypt-nodejs';
import { BaseModel } from './base';
const saltRounds = 10;

@Table({
    tableName: 'users'
})

export class User extends BaseModel {

    @Column
    firstName!: string;

    @Column
    lastName!: string;

    @Column
    password!: string;

    @Column
    email!: string;

    @Column
    isActive!: boolean;

    @Column
    companyId: string

    @ForeignKey(() => Role)
    @Column
    roleId!: string;

    @BelongsTo(() => Role)
    role!: Role;

    @BeforeCreate
    @BeforeUpdate
    static hashPassword(user: User) {
        if (user.password) {            
            var salt = bcrypt.genSaltSync(saltRounds);
            user.password = bcrypt.hashSync(user.password, salt);
        }
    }
}

现在,当我创建一个新用户时,模型将对密码进行哈希处理并将哈希密码保存在表中,但是当我尝试更新用户密码时,密码将以纯文本格式保存。所以我猜@BeforeCreate可以正常工作,而@BeforeUpdate挂钩不能。

我什至尝试将两个钩子分开并赋予它们自己的功能:

@BeforeCreate
static hashPasswordBeforeCreate(user: User) {
    if (user.password) {            
        var salt = bcrypt.genSaltSync(saltRounds);
        user.password = bcrypt.hashSync(user.password, salt);
    }
}


@BeforeUpdate
static hashPasswordBeforeUpdate(user: User) {
    if (user.password) {            
        var salt = bcrypt.genSaltSync(saltRounds);
        user.password = bcrypt.hashSync(user.password, salt);
    }
}

但是之前的更新仍然无法正常工作。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我认为您必须添加

individualHooks:是

在您的更新查询中,例如-users.update(data,{where:{id},personalHooks:true});

然后,您可以像user.dataValues这样将数据访问到@BeforeUpdate挂钩中。

例如。

@BeforeUpdate
static hashPasswordBeforeUpdate(user: User) {
        user.dataValues.password = bcrypt.hashSync(user.dataValues.password, salt);
}

这种方法对我来说很好。