codeinprogress
codeinprogress

Reputation: 3501

Sequelize Typescript @BeforeUpdate Hook not working

I am using Sequelize Typescript module for my serverless lambda function. The user model has two hooks, beforecreate and beforeupdate. The user model looks like this:

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);
        }
    }
}

Now when I create a new user the model hashes the password and saves the hashed password in the table, but when I try to update the password of a user the password is saved in plain text. So I am guessing the @BeforeCreate works and the @BeforeUpdate hook does not.

I even tried separating the two hooks and giving them their own functions:

@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);
    }
}

But the before update still does not work. What am I doing wrong?

Upvotes: 4

Views: 5430

Answers (1)

salmantech
salmantech

Reputation: 56

I think you have to add

individualHooks: true

in your update query like this - users.update(data, {where: {id}, individualHooks: true});

Then, you can access the data into your @BeforeUpdate hook like this user.dataValues.

For ex.

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

This method works fine for me.

Upvotes: 3

Related Questions