使用Sequelize的afterCreate钩子更新另一张表报undefined错误如何解决
问题原因与修复方案
1. 直接报错原因
你报错的核心原因是模型名称大小写不匹配:
- 你在
inventory.model.js中定义模型时,sequelize.define的第一个参数是小写字符串"inventory",Sequelize会自动把这个名称作为sequelize.models对象下的键名 - 你在hook中调用时写的是首字母大写的
sequelize.models.Inventory,自然读不到对应的模型,才会报update属性undefined的错误,改成小写的sequelize.models.inventory即可解决报错问题。
2. 其他隐藏问题修复
除了大小写问题,现有代码还有两处逻辑错误会导致库存更新失效:
- 关联匹配条件错误:当前where条件写的是
{ id: ingoing_inventory.id },是用入库流水表的ID匹配库存表的ID,不符合关联逻辑,应该用入库流水表中关联库存表的外键inventoryId作为匹配条件 - 增量计算逻辑错误:你写的
sequelize.literal('balance + ingoing_inventory.quantity')会被数据库识别为取当前行的ingoing_inventory.quantity字段,而不是当前新增的入库记录的数量值,需要把实际值传入 - 异步逻辑缺失:Sequelize的hook支持异步,如果不加async/await,可能会出现入库记录提交了但库存还没更新的时序问题
3. 修正后的ingoing_inventory.model.js代码
module.exports = (sequelize, Sequelize) => { const IngoingInventory = sequelize.define("ingoing_inventory", { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false, }, quantity: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0 } }, { freezeTableName: true, hooks: { // 标记为异步方法 afterCreate: async function(ingoing_inventory) { // 模型名改为小写inventory,更新条件替换为库存外键,增量计算传入实际数值 await sequelize.models.inventory.update( { balance: sequelize.literal(`balance + ${ingoing_inventory.quantity}`)}, {where: { id: ingoing_inventory.inventoryId }} ); } } }); return IngoingInventory; };
如果关联时自定义了外键名称,把where条件里的inventoryId替换成你自定义的外键字段名即可。
内容的提问来源于stack exchange,提问作者Aditya D.
相关产品推荐
相关产品推荐

