Nestjs提示:如何将同一提供商的多个版本注入一个模块(例如:许多Axios实例)
#javascript #typescript #node #nestjs

对于Nestjs V8,V9和V10

什么?

假设您要使用由您无法控制的第三方LIB创建的同一Nestjs提供商的多个“版本”。

例如,当使用@nestjs/axioskoude0 module时,我们可以使用动态模块HttpModule.register()来配置我们的axios实例。该模块公开了具有这种配置的HttpService。但是,如果我们想拥有许多Axios实例,每个Axios实例都有自己的配置并在一个模块中导入所有内容?

我们无法做以下内容,因为没有办法区分两个HttpService提供商,因为它们生活在同一注射令牌下(这是类参考HttpService),尽管我们有两个该课程的实例:

@Module({
  imports: [
    HttpModule.register({
      baseURL: 'https://api.example.com',
    }),
    HttpModule.register({
      baseURL: 'https://api.another.example.com',
    }),
  ],
})
export class AppModule {
  constructor(
    private readonly httpService: HttpService,
  ) {
    console.log(this.httpService.axiosRef.defaults.baseURL) // https://api.example.com
  }
}

实现Afiak的唯一惯用方法是为每种配置创建包装器模块。该模块将通过另一个注射令牌导入HttpModule.register()并将HttpService提供商暴露,因此我们可以像往常一样注入该提供商以及其他HttpService的实例。

如何?

这样:

  • app.module.ts-我们想在此处注入多个HTTP服务
import { Module } from '@nestjs/common'
import { CatApiModule, CatApi } from './cat-api'

@Module({
  imports: [
    CatApiModule,
  ],
})
export class AppModule {
  constructor(private readonly catApi: CatApi) {}
}
  • cat-api.module.ts-我们的包装模块。负责为CATS API创建HTTP服务客户端
import { Module, OnModuleInit } from '@nestjs/common'
import { HttpModule, HttpService } from '@nestjs/axios'
import { CatApi } from './cat-api.service'

@Module({
  imports: [
    HttpModule.register({ // line A
      timeout: 1_000,
      maxRedirects: 2,
      baseURL: 'https://http.cat',
    }),
  ],
  providers: [
    {
      provide: CatApi,
      useExisting: HttpService, // line B
    }
  ],
  exports: [CatApi], // line C
})
export class CatApiModule implements OnModuleInit {
  constructor(private readonly httpService: HttpService) {}

  onModuleInit() {
    this.httpService.axiosRef.defaults.headers.common['Accept'] = 'application/json'
  }
}
  • cat-api.service.ts
import { HttpService } from '@nestjs/axios'

export abstract class CatApi extends HttpService {}

怎么运行的

导入动态模块HttpModule.register() line a )时,我们将在CatApiModule模块中使用HttpService提供商。

由于我们不想因适当的名称碰撞而以相同的注入令牌曝光该提供商,因此我们可以利用koude15别名提供商( line b )来告诉Nestjs我们现在有2个提供商,一个只是另一个的别名。

然后,我们将CatApi代币而不是HttpService揭露为proxy,以消耗HttpService提供商( line c )。

您可以看到CatApiabstract class(打字稿功能)。这是告诉开发人员不应该初始化该类的一种方式。另外,我们在此处使用具体类,以避免使用@Inject()实用程序,同时注入HttpService