我在 Node 后端使用 Sequelize 来访问 MySQL 数据库,我意识到,根据您更新对象的方式,afterValidate
hook 被调用一次或两次。我会用一个例子更好地解释它:
我们有一个 Shop
由以下 Sequelize 模型定义的实体:
module.exports = (sequelize, DataTypes) => {
const Shop = sequelize.define('Shop', {
name: DataTypes.STRING,
address: DataTypes.STRING
}, {
freezeTableName: true,
hooks: {
afterValidate: (shop, options) => {
shop.name += '_HOOKED!'; // Just for testing
}
}
});
};
我使用
db.Shop.create()
添加了几家商店id 为 1 和 2。现在,我正在尝试 Sequelize 提供的以下 2 个选项来更新商店对象:选项 1
db.Shop.update({ name: 'Coffee Shop TEST' },
{ where: { id: shop.id } }).then((data) => {
console.log("All good!!");
}).catch((error) => {
console.log("No good: ", error);
});
选项 2
db.Shop.findOne({ where: { id: 1 } }).then((shop) => {
shop.update({ name: 'Coffee Shop TEST' }).then((data) => {
console.log("All good!!: ");
}).catch((error) => {
console.log("No good: ", error);
});
}).catch((error) => {
console.error("Error al actualizar: ", error);
});
如果我使用第一个选项,商店会正确更新,
afterValidate
钩子(Hook)被调用一次,所以现在的名字是:Coffee Shop TEST_HOOKED!
.但是,如果我使用第二个选项,钩子(Hook)会被调用两次,因此名称被错误地设置为
Coffee Shop TEST_HOOKED!_HOOKED!
。 .为什么会这样?提前致谢,
最佳答案
我可能有点晚了,但对于遇到这个问题的人来说,这里是解决方案:
您可以设置options.validate = false
在模型的 beforeUpdate Hook 中。
出于某种原因,Sequelize 在更新对象时会运行 afterValidate 钩子(Hook)两次...
关于javascript - 更新时调用了两次 Sequelize afterValidate 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58714896/