我正在从
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.
您需要为提供商单独导入 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 {}