我正在构建一个 API,它将充当连接 2 个服务(company-order
和 partner-order
)的网关,每个服务都有其特定的 URL 主机,超时等,在我的应用程序中,我添加了一个 Controller ,它将调用 company-order
API 并将数据发送到 partner-order
API,模块组织如下这个:
- company/
- company-http-config.service.ts
- company-order.service.ts
- company.module.ts
- partner/
- partner-http-config.service.ts
- partner-order.service.ts
- partner.module.ts
- orders/
- orders.controller.ts
- orders.module.ts
每个模块都有自己的 HttpModule
配置,在 .module.ts
文件中声明;
// company.module.ts
imports: [
HttpModule.registerAsync({
useClass: CompanyHttpConfig,
}),
]
// partner.module.ts
imports: [
HttpModule.registerAsync({
useClass: PartnerHttpConfig,
}),
]
每个服务导入其 HttpService
以使用其各自的 HttpConfig
类:
// partner-order.service.ts
export class PartnerOrderService {
construct(private readonly http: HttpService) {}
}
// company-order.service.ts
export class CompanyOrderService {
construct(private readonly http: HttpService) {}
}
为了在 order
模块上使用这两项服务,我必须将 http-config
导入到我的 order
模块中,或者我会收到一条错误消息,指出我需要导入 HttpService
类。
Nest can't resolve dependencies of the PartnerOrderService (?). Please make sure that the argument HttpService at index [0] is available in the OrderModule context.
我可以在 OrderModule
上导入 HttpService
:
imports: [
HttpModule.registerAsync({
useClass: PartnerHttpConfigService,
}),
]
但现在我还需要将 CompanyOrderService
导入 OrderModule
并定义 HttpService
,但如果我这样做, >HttpModule
将在 OrderModule
导入 key 上重复。
如何将两个不同的模块导入到具有单独 Http
配置的单个模块中?
最佳答案
您的 CompanyOrderModule
应该在其 imports
中包含 HttpModule.register()
以及所需的特定配置和 CompanyOrderService
在 providers
和 exports
数组中。
现在,您的 OrderModule
应该在 imports
数组中包含 CompanyOrderModule
和 HttpModule.register(orderConfig)
并且只有 providers
数组中的 OrderService
。
因为 CompanyOrderModule
导出
CompanyOrderService
,所以 OrderService
有权注入(inject) CompanyOrderService
code> 而无需您的 OrderModule
重新声明重新配置提供程序
粗略配置的示例看起来像这样
公司订单模块
@Module({
imports: [HttpModule.registerAsync({
useClass: CompanyHttpConfig
})],
providers: [CompanyOrderService],
exports: [CompanyOrderService],
})
export class CompanyOrderModule {}
合作伙伴订单模块
@Module({
imports: [HttpModule.registerAsync({
useClass: PartnerHttpConfig
})],
providers: [PartnerOrderService],
exports: [PartnerOrderService],
})
export class PartnerOrderModule {}
订单模块
@Module({
imports: [CompanyOrderModule, PartnerOrderModule],
providers: [OrderService],
controllers: [OrderController],
})
export class OrderModule {}
订单 Controller
@Controller()
export class OrderController {
constructor(
private readonly orderService: OrderService,
private readonly companyOrderService: CompanyOrderService,
private readonly partnerOrderService: PartnerOrderService,
) {}
@Get('/example1')
public example1() {
return this.partnerOrderService.doSomething();
}
@Get('/example2')
public example2() {
return this.companyOrderService.doSomething();
}
// ...
}
关于typescript - 如何在nestJS上调用单个模块内的多个模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75879222/