NestJS中如何在Guard里注入Kafka Client等服务或类?
NestJS Guard 注入Kafka客户端正确实现步骤
1. 给AuthGuard添加可注入装饰器并实现构造注入
首先需要为AuthGuard添加@Injectable()装饰器,让Nest的DI容器可以识别并管理该类,再通过构造函数注入Kafka客户端:
import { Injectable, CanActivate, ExecutionContext, Inject } from '@nestjs/common'; import { ClientKafka } from '@nestjs/microservices'; @Injectable() // 必须添加该装饰器才能触发DI注入 export class AuthGuard implements CanActivate { // 注入token需要和你全局模块中Kafka客户端的provider token完全一致 constructor(@Inject('KAFKA_CLIENT') private readonly _client: ClientKafka) {} public async canActivate(context: ExecutionContext): Promise<boolean> { try { const request = context.switchToHttp().getRequest(); const authorization: string = request.get('Authorization'); // ...原有业务逻辑 return true; } catch (err) { return false; } } }
2. 确认全局Kafka模块的导出配置
你已创建的全局模块需要正确配置provider和导出项,示例配置如下:
import { Global, Module } from '@nestjs/common'; import { ClientKafka, ClientsModule } from '@nestjs/microservices'; @Global() @Module({ imports: [ ClientsModule.register([ { name: 'KAFKA_CLIENT', // 这里的name就是注入时需要使用的token options: { client: { brokers: ['localhost:9092'], // 其他Kafka客户端配置 }, consumer: { groupId: 'auth-consumer-group' } } } ]) ], exports: [ClientsModule], // 必须导出ClientsModule,才能让其他模块访问到注册的Kafka客户端 }) export class KafkaGlobalModule {}
3. 正确使用Guard触发DI
- 如果你是局部使用Guard,直接在控制器/路由上用
@UseGuards(AuthGuard)传入类即可,不要手动new AuthGuard()实例,手动实例化的类不受Nest DI管理,无法注入依赖 - 如果你需要注册全局Guard,需要在模块的providers中通过
APP_GUARDtoken注册,不要自己实例化:
import { Module } from '@nestjs/common'; import { APP_GUARD } from '@nestjs/core'; import { AuthGuard } from './auth.guard'; @Module({ providers: [ { provide: APP_GUARD, useClass: AuthGuard, } ] }) export class AppModule {}
内容的提问来源于stack exchange,提问作者wildegor
相关产品推荐
相关产品推荐

