NestJS无法在AuthGuard中注入服务问题求助
问题:NestJS全局AuthGuard注入JwtTokenService失败报错
尝试在JwtAccessTokenGuard中注入JwtTokenService时触发依赖解析错误,相关代码及报错信息如下:
守卫代码
@Injectable() export class JwtAccessTokenGuard implements CanActivate { constructor( @Inject(JwtTokenService) private readonly jwtTokenService: JwtTokenService, ) {} async canActivate(context: ExecutionContext): Promise<boolean> { const request = context.switchToHttp().getRequest(); const token = this.extractTokenFromHeader(request); if (!token) throw new UnauthorizedException(); try { return true; } catch { throw new UnauthorizedException(); } } private extractTokenFromHeader(request: Request): string | undefined { const [type, token] = request.headers.authorization?.split(' ') ?? []; return type === 'Bearer' ? token : undefined; } }
AppModule全局守卫配置
@Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), AuthModule, UserModule, PrismaModule, BcryptModule, JwtTokenModule, LibModule, TwoFaModule, ], providers: [ { provide: APP_GUARD, useClass: JwtAccessTokenGuard, }, ], }) export class AppModule {}
UserModule代码
@Module({ controllers: [UserController, JwtTokenModule], providers: [UserService, PrismaService], exports: [UserService], }) export class UserModule {}
JwtTokenModule代码
import { Module } from '@nestjs/common'; import { JwtTokenService } from './jwtToken.service'; import { JwtModule } from '@nestjs/jwt'; @Module({ imports: [JwtModule], providers: [JwtTokenService], exports: [JwtTokenService], }) export class JwtTokenModule {}
报错信息
[Nest] 79549 - 09/28/2023, 12:35:42 AM ERROR [ExceptionHandler] Nest can't resolve dependencies of the JwtAccessTokenGuard (?). Please make sure that the argument JwtTokenService at index [0] is available in the UserModule context. Potential solutions: - Is UserModule a valid NestJS module? - If JwtTokenService is a provider, is it part of the current UserModule? - If JwtTokenService is exported from a separate @Module, is that module imported within UserModule? @Module({ imports: [ /* the Module containing JwtTokenService */ ] }) Error: Nest can't resolve dependencies of the JwtAccessTokenGuard (?). Please make sure that the argument JwtTokenService at index [0] is available in the UserModule context.
解决方案
1. 修复UserModule的错误配置
UserModule中错误地将JwtTokenModule放在了controllers数组里,这是核心问题。全局守卫作用于UserModule的路由时,Nest会检查UserModule上下文是否能提供守卫的依赖,因此需要将JwtTokenModule移到imports数组中:
@Module({ controllers: [UserController], imports: [JwtTokenModule], // 修正:将JwtTokenModule移到这里 providers: [UserService, PrismaService], exports: [UserService], }) export class UserModule {}
2. 简化守卫的注入写法
@Inject(JwtTokenService)是多余的,Nest默认会以类作为注入令牌,直接简化构造函数即可:
constructor(private readonly jwtTokenService: JwtTokenService) {}
3. (可选)优化全局守卫的组织方式
如果项目规模较大,建议将JwtAccessTokenGuard放到单独的AuthModule中,并在AuthModule中导入JwtTokenModule,然后在AppModule中导入AuthModule。这样依赖关系更清晰,避免其他模块重复导入依赖:
// AuthModule示例 @Module({ imports: [JwtTokenModule], providers: [ JwtAccessTokenGuard, { provide: APP_GUARD, useClass: JwtAccessTokenGuard, }, ], }) export class AuthModule {}
内容的提问来源于stack exchange,提问作者user16715270
相关产品推荐
相关产品推荐

