'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 |