如何将 NestJS 中的提供程序从一个模块注入到另一个提供程序?

问题描述 投票:0回答:1

我正在从

TicketRepository
导出
TicketModule
,然后从
ModelsModule
库在
@common/models
中重新导出。
TicketAccessGuard
必须注入
TicketRepository
。我在
IncidentManagementModule
中使用工厂模式来创建
TicketAccessGuard
,因为可以在此处访问
@common/models
库。然后我导出
TokenAccessGuard
。我将
IncidentManagementModule
导入应用程序模块并使用防护(应用程序模块不允许导入模型模块)。

这是 TicketModule 文件

@Module({
  providers: [TicketRepository],
  exports: [TicketRepository],
})
export class TicketModule {}

这是我的 ModelsModule 文件

import { TicketModule } from "./ticket/ticket.module";

@Module({
  imports: [TicketModule],
  providers: [],
  exports: [TicketModule],
})
export class ModelsModule {}

这是我的事件管理模块

import { ModelsModule, TicketRepository } from "@common/models";
import { TicketAccessGuard } from "./guards";
    
@Module({
  imports: [ModelsModule, CoreModule, AuthModule, MailerModule],
  providers: [
    {
      provide: TicketAccessGuard,
      useFactory: (ticketRepository: TicketRepository) =>
        new TicketAccessGuard(ticketRepository),
      inject: [TicketRepository],
    },
  ],
  exports: [TicketAccessGuard],
})
export class IncidentManagementModule {}

这是我的应用程序模块

@Module({
  imports: [IncidentManagementModule],
  controllers: [IncidentsController]
})
export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes("*");
  }
}

最后这是我使用守卫的地方

@Get(':incidentId')
@Roles('admin', 'agent', 'physician', 'pharmacist', 'representative')
@UseGuards(TicketAccessGuard)
async function getIncidentDetails(@Param() query: GetIncidentDetailsQuery) {
  const result = await this.getIncidentDetailsQueryHandler.execute(query);

  if (isLeft(result)) {
    const error = result.left;

    throw new HttpException(error, HttpStatus.INTERNAL_SERVER_ERROR);
  }

  return result.right;
}

这可能吗?目前它给我以下错误:

Nest can't resolve dependencies of the TicketAccessGuard (?). 
Please make sure that the argument TicketRepository at index [0] is available in the AppModule context.
nestjs
1个回答
0
投票

您需要为提供商单独导入 TicketModule/ModelsModule。

import { ModelsModule, TicketRepository } from "@common/models";
import { TicketAccessGuard } from "./guards";
    
@Module({
  imports: [ModelsModule, CoreModule, AuthModule, MailerModule],
  providers: [
    {
      imports: [ModelsModule], // or TicketModule
      provide: TicketAccessGuard,
      useFactory: (ticketRepository: TicketRepository) =>
        new TicketAccessGuard(ticketRepository),
      inject: [TicketRepository],
    },
  ],
  exports: [TicketAccessGuard],
})
export class IncidentManagementModule {}
© www.soinside.com 2019 - 2024. All rights reserved.