typescript - 如何在nestJS上调用单个模块内的多个模块?

标签 typescript nestjs

我正在构建一个 API,它将充当连接 2 个服务(company-orderpartner-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() 以及所需的特定配置和 CompanyOrderServiceprovidersexports 数组中。

现在,您的 OrderModule 应该在 imports 数组中包含 CompanyOrderModuleHttpModule.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/

相关文章:

typescript - 我可以使用 Nestjs 注入(inject)接口(interface)而不是类吗?

javascript - TypeScript 和无服务器 : `this` Undefined When Calling Private Methods from Public Methods

javascript - 如何向 Material UI 添加自定义字体粗细?

angular - Angular5 中的 PubNub 历史

node.js - 在 VS Code 中使用 nodemon 调试 nestJS 应用程序

heroku - 如何在 Heroku 上使用 Prisma 2 CLI

node.js - NestJS 加密 : What is the purpose of the promisify(scrypt)?

angular - 如何在 Angular 2 中将 header 设置为 application/json

javascript - 如何在 ionic 4 中使用 alertcontroller 返回 promise ?

javascript - WebSocketGateway 中的 WsException 不起作用