'why sequelize beforeUpdate hook doesn't work?

I have a simple user model with 2 hooks.

User.beforeCreate(setSaltAndPass)
User.beforeUpdate(setSaltAndPass)

the first works perfectly but the beforeUpdate does not run, according to the documentation you should have no problem executing the following

await User.update(user, {
             where: {
               id
             }

         })

is saving the key as plain text, it does not happen for example with the create. Curiously beforeBulkUpdate is executed when it is updated.

this is the callback, the detail is that in bulk I don't have the changed property or at least I don't know how to access it.

const setSaltAndPass = user => {
   if (user.changed('pass')) {
     user.salt = User.generateSalt()
     user.pass = User.encriptPass(user.pass(), user.salt())
   }
}

does its job, but hook its not excecuted.



Solution 1:[1]

I had the same issue in TS just now. Turn out, that the @BeforeUpdate hook is triggered, when you first find a single record and then update it:

await Model.findOne(options).then((result) => { 
    result.update(options); 
});

In case you prefer the Model.update(...) approach, you can use the @BeforeBulkUpdate hook instead.

Found this info here: https://github.com/sequelize/sequelize/issues/6253

This worked for me, hope it helps!

Solution 2:[2]

You need to set the individualHooks to true in update function, please see the below example

const [, [user]] = await User.update(body, {
      where,
      returning: true,
      attributes: ['userId', 'email'],
      individualHooks: true,
    });

Solution 3:[3]

Set individualHooks: true, in the options block

await User.update(user, {
  where: {
    id
  },
    individualHooks: true,
});

Solution 4:[4]

Use beforeBulkUpdate instead on beforeUpdate

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Jaspal Singh
Solution 3 Sandeep P
Solution 4 Amir