对于Nestjs V8,V9和V10
什么?
假设您要使用由您无法控制的第三方LIB创建的同一Nestjs提供商的多个“版本”。
例如,当使用@nestjs/axios
的koude0 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 )。
您可以看到CatApi
是abstract class(打字稿功能)。这是告诉开发人员不应该初始化该类的一种方式。另外,我们在此处使用具体类,以避免使用@Inject()
实用程序,同时注入HttpService
。