Nest.js导入依赖动态BullModule的模块时依赖解析报错如何解决
问题解决方案
该错误由两处配置错误共同导致,按以下步骤修改即可:
1. 给QModule添加导出配置
Nest模块默认不对外暴露内部的provider,你需要在QModule中显式导出供外部使用的QService,修改q.module.ts代码如下:
import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; import { join } from 'path'; import { QService } from './q.service'; @Module({ imports: [ BullModule.registerQueue({ name: 'volume', processors: [ { name: 'create', path: join(__dirname, 'vol.processor.js'), }, ], }), ], providers: [QService], // 新增exports配置,对外暴露QService exports: [QService] }) export class QModule {}
注意:如果原QModule没有写类导出,记得补上export class QModule {}的声明
2. 删除AppModule中重复的QService声明
你已经在AppModule的imports中引入了QModule,QModule导出的QService可以直接在App模块上下文使用,不需要再在AppModule的providers中重复声明QService。重复声明会导致App模块尝试自己实例化QService,但App模块内没有QService依赖的BullQueue_volume队列实例,就会触发依赖注入失败的错误。
修改app.module.ts的providers配置:
const ENV = process.env.NODE_ENV; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: !!ENV ? `.env.${ENV}` : '.env', }), BullModule.forRootAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ redis: { host: configService.get('REDIS_HOST'), port: Number(configService.get('REDIS_PORT')), password: configService.get('REDIS_PASSWORD'), }, }), inject: [ConfigService], }), IdentityModule, QModule, ], controllers: [AppController], providers: [ AppService, IdentityService, // 移除此处的QService声明 ], }) export class AppModule {}
修改完成后重启服务即可解决该错误。
内容的提问来源于stack exchange,提问作者cybercoder
相关产品推荐
相关产品推荐

