NestJS CQRS注入的Service为undefined,调用方法报错是什么原因?
问题原因及排查方案
- 检查
UpdateSensorsProductsCommandHandler是否被注册为SystemCqrsModule的provider。如果未将CommandHandler加入模块的providers数组,Nest依赖注入容器不会自动处理它的构造函数参数,会导致注入的Service为undefined。
修正示例:@Module({ imports: [ CqrsModule, SensorProductsListModule, ], providers: [UpdateSensorsProductsCommandHandler], // 必须添加对应的CommandHandler到providers exports: [CqrsModule], }) export class SystemCqrsModule {} - 检查
SensorProductsListService类是否添加了@Injectable()装饰器。漏加该装饰器时Nest无法识别其为可注入的服务,注入时会返回undefined。 - 检查如果需要在其他模块使用该CommandHandler,是否将
UpdateSensorsProductsCommandHandler加入了SystemCqrsModule的exports数组。仅导出CqrsModule无法让外部模块获取到CommandHandler的正确实例,依赖注入会失败。 - 检查是否存在手动实例化
UpdateSensorsProductsCommandHandler的代码。如果是通过new UpdateSensorsProductsCommandHandler()手动创建实例,而非由Nest DI容器托管创建,构造函数的参数不会被自动注入,自然service属性为undefined。 - 检查是否存在循环依赖。如果
SensorProductsListModule反过来依赖SystemCqrsModule,或者服务之间存在循环引用,会导致依赖注入时序异常,注入的实例为undefined。可通过forwardRef处理循环依赖:constructor( private eventBus: EventBus, @Inject(forwardRef(() => SensorProductsListService)) private sensorProductListService: SensorProductsListService, ) {}
内容的提问来源于stack exchange,提问作者moahammad daneshjoo
相关产品推荐
相关产品推荐

