@nestjs/jwt报secretOrPrivateKey must have a value错误,无法生成Token
解决@nestjs/jwt ^9.0.0 生成Token时"secretOrPrivateKey must have a value"错误
问题根源
你在AppModule的providers数组中手动声明了AuthService和JwtService,这会导致NestJS创建未配置secret的全新JwtService实例,覆盖了AuthModule中通过JwtModule.register()配置好的实例。当AppController注入这个未配置的AuthService时,调用jwtService.sign()自然会提示secret缺失。
解决方案
步骤1:修改AppModule代码
移除providers中的AuthService和JwtService,因为AuthModule已经被导入,且AuthService已在AuthModule的exports中声明,AppModule可以直接依赖注入正确的实例:
@Module({ imports: [ AuthModule, UsersModule, MongooseModule.forRoot( `mongodb+srv://${dbConstant.username}:${dbConstant.password}@cluster0.34saife.mongodb.net/users?retryWrites=true&w=majority`, ), ], controllers: [AppController], providers: [AppService], // 仅保留AppService }) export class AppModule {}
步骤2:验证AuthModule配置
你的AuthModule中JwtModule.register()的配置本身是正确的,无需修改:
JwtModule.register({ secret: 'ndUdggLVxTccGBJmr1BoFvAQnSEt+Osx5pgdGTOL9XwajAn4fe40Q41NbBTa9wNekjKuTLdhWBJQhi71JShvi7rFoayh3QIuEA3e4Eq8mU7lwArngzFWdSiIJgMplTLboFOeR7q8pv7MoDcl2dBmuZI4NQ5GglznC8Ebl20Sa41cg4EDkuppblXa+bqvZeSQRg0d/AL9f8NIBC3N6sEyc1nM0MWeWc1CxKuljTVQm1g2RVLG1cSNU/a5vpmy/9UwYiDiIr2aCbD60EWkQMR2vDvW/0LsVun72xEqUTdY5UuczofpmhtCxm+yw9R7iFsNcNuJAyAQN0T9OtMyt9wzPA==', signOptions: { expiresIn: '1h' }, }),
原理说明
NestJS的依赖注入系统遵循模块作用域:
- 在
AuthModule中导入JwtModule.register()后,Nest会创建一个带有secret配置的JwtService实例,仅在AuthModule内部可用(或通过exports对外暴露)。 - 若在
AppModule的providers中手动添加AuthService,Nest会重新实例化AuthService,此时注入的JwtService是全局默认的未配置实例,而非AuthModule中配置好的实例。
内容的提问来源于stack exchange,提问作者Md.Shakil Shaikh
相关产品推荐
相关产品推荐

