NestJS使用@nestjs/axios启动报错:无法解析HttpService的AXIOS_INSTANCE_TOKEN依赖
错误根源
这个报错由HttpModule、HttpService的错误配置导致,核心问题如下:
- 你将模块类
HttpModule放在了providers数组中,只有可注入的服务类才能放在providers里,模块仅可放在imports数组中 - 你在两个模块的providers中重复手动声明了
HttpService,HttpService是HttpModule内部导出的服务,无需手动声明,手动声明会导致Nest尝试实例化HttpService时找不到它依赖的AXIOS_INSTANCE_TOKEN - 你在根模块配置了自定义参数的HttpModule,但子模块导入的是原始未配置的HttpModule,没有复用根模块的配置
修复步骤
第一步:修正AppModule配置
给HttpModule的异步注册配置添加isGlobal: true设为全局生效,同时删掉providers和exports中多余的HttpModule、HttpService声明:
@Module({ imports: [ FileModule, ConfigurationModule, AxelGlobeModule, HttpModule.registerAsync({ isGlobal: true, // 新增全局生效配置,所有子模块无需重复导入 imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ timeout: configService.get('HTTP_TIMEOUT') || 1000, maxRedirects: configService.get('HTTP_MAX_REDIRECTS') || 5, baseURL: `{url}`, paramsSerializer: (params) => { return qs.stringify( params, PARAMS_SERIALIZER_DEFAULT_OPTIONS as IStringifyOptions, ); }, }), inject: [ConfigService], }), ], controllers: [AppController], providers: [AppService], })
第二步:修正AxelGlobeModule配置
删掉imports里的HttpModule、providers里的HttpService,无需重复导入和声明:
@Module({ controllers: [AxelGlobeController], providers: [AxelGlobeService], imports: [ConfigModule] // 如无需在该模块使用ConfigService可直接删除该行 })
第三步:验证业务注入
你原有的注入代码无需修改,直接正常使用即可:
constructor(private readonly httpService: HttpService) {}
内容的提问来源于stack exchange,提问作者Matheus Bento
相关产品推荐
相关产品推荐

