NestJS中JwtService无需传密钥却报secretOrPrivateKey错误求助
问题解决方案
问题根源
你在AppModule的providers数组中手动注册了JwtService,这会导致NestJS的DI容器优先使用这个未经过配置的JwtService实例,而非AuthModule中全局注册的已配置版本。因此调用signAsync时不传secret就会触发缺失密钥的错误。
修复步骤
移除AppModule中手动注册的JwtService
修改app.module.ts,从providers数组里删掉JwtService:import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ConfigModule } from '@nestjs/config'; import { AuthController } from './auth/auth.controller'; import { AuthService } from './auth/auth.service'; import { UserService } from './user/user.service'; import { PrismaService } from './prisma.service'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, }), ], controllers: [AppController, AuthController], providers: [AppService, AuthService, UserService, PrismaService], }) export class AppModule {}验证AuthService中的signAsync调用
去掉signAsync中的secret参数,直接使用全局配置:return { accessToken: await this.jwtService.signAsync(payload), };
原理说明
当你在AuthModule中通过JwtModule.register({ global: true })全局注册Jwt模块后,NestJS会自动在整个应用范围内提供配置好的JwtService实例。手动在AppModule的providers中添加JwtService会覆盖全局模块的实例,而这个手动注册的实例没有任何配置,所以会出现密钥缺失的错误。
内容的提问来源于stack exchange,提问作者samuel potter
相关产品推荐
相关产品推荐

