NestJS subscriber hooks除beforeTransaction外其余未触发如何解决
TypeORM 实体订阅器钩子不触发排查方案
你当前全局事务钩子可以正常触发,说明订阅器本身已经被TypeORM加载,优先排查以下问题:
- 实体类匹配异常
检查listenTo()方法返回的TransferEvent导入路径是否和业务代码、TypeORM配置中注册的实体类路径完全一致,不同路径导入的同名类会被TypeORM识别为不同实体,导致实体相关钩子无法匹配触发。 - 钩子触发时机不匹配
确认你对钩子触发时机的预期符合TypeORM的规则:beforeCreate:仅在调用repository.create()方法时触发,不会在save阶段触发beforeInsert/afterInsert:仅在实体第一次插入数据库时触发,更新操作不会触发beforeUpdate/afterUpdate:仅在实体已有主键、执行更新操作时触发
- 调用方法不符合触发规则
如果你使用repository.insert()、repository.update()、queryBuilder等直接操作数据库的方法,默认不会触发实体级别的订阅器钩子,只有save、remove等基于实体实例的方法才会触发这类钩子。你当前使用的save方法本身符合触发要求,无需调整。 - TypeORM版本兼容问题
如果你使用的是0.3.x以上版本,老旧的getRepository()API已被废弃,需要通过DataSource.getRepository()获取仓库实例,否则可能出现实体钩子不触发的异常,对应修改后的业务代码参考:const transferEvents = AppDataSource.getRepository(TransferEvent).create(data); await AppDataSource.getRepository(TransferEvent).save(transferEvents); - 订阅器注册配置遗漏实体扫描规则
如果你是用通配符路径配置subscribers,确认通配符路径可以匹配到你的订阅器文件,也可以直接显式传入订阅器类到配置的subscribers数组:// DataSource 配置示例 export const AppDataSource = new DataSource({ // 其他数据库配置 entities: [TransferEvent], subscribers: [TransferEventSubscriber] })
内容的提问来源于stack exchange,提问作者user16780074
相关产品推荐
相关产品推荐

