why sequelize beforeUpdate hook doesn't work?

Viewed 3604

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.

4 Answers

Set individualHooks: true, in the options block

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

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!

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

Use beforeBulkUpdate instead on beforeUpdate

Related