SecretOrPrivateKey 必须有一个值 - NestJs

car*_*erd 3 javascript jwt nest

在我的服务器中实现 jwt 时出现此错误。我正在使用 NestJs 并且正在遵循文档。我一直在这里寻找有关此错误的解决方案,但似乎没有任何作用。我已将密钥存储在 .env 文件中,在 app.module 中添加 ConfigModule.forRoot() ,这样我就可以成功读取所有环境变量。这是我的代码,如果有人能指出我正确的方向。

应用程序模块.ts

@Module({
  imports: [
    ConfigModule.forRoot(),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DB_HOST,
      port: +process.env.DB_PORT,
      username: process.env.DB_USER,
      password: process.env.DB_PASS,
      database: process.env.DB_NAME,
      entities: ['dist/**/*.entity{.ts,.js}'],
      synchronize: false,
    }),
    UsersModule,
    AuthModule,
    PolsModule,
  ],
  controllers: [UsersController, AuthController, PolsController],
  providers: [UsersService, AuthService, PolsService, JwtService],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

auth.module.ts

@Module({
  imports: [
    UsersModule,
    PassportModule,
    JwtModule.register({
      secret: process.env.JWT_SECRET_KEY,
      signOptions: { expiresIn: '4h' },
    }),
  ],
  providers: [AuthService, UsersService, LocalStrategy, JwtStrategy],
  controllers: [AuthController],
})
export class AuthModule {}
Run Code Online (Sandbox Code Playgroud)

auth.controller.ts

@Controller('auth')
export class AuthController {
  constructor(
    private authService: AuthService,
    private usersService: UsersService,
  ) {}

  @UseGuards(LocalAuthGuard)
  @Post()
  async login(@Request() req) {
    return this.authService.login(req.user);
  }
}
Run Code Online (Sandbox Code Playgroud)

auth.service.ts

@Injectable()
export class AuthService {
  constructor(
    private usersService: UsersService,
    private jwtService: JwtService,
  ) {}

  async login(user: any) {
    const payload = { username: user.username, sub: user.id };
    console.log(process.env.JWT_SECRET_KEY);
    return {
      access_token: this.jwtService.sign(payload),
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

控制台错误

// console.log(process.env.JWT_SECRET_KEY)
fb8C47vylwS
[Nest] 50225  - 01/07/2022, 17:46:37   ERROR [ExceptionsHandler] secretOrPrivateKey must have a value
Error: secretOrPrivateKey must have a value
    at Object.module.exports [as sign] (/Users/user/dev/backend/pol-api/node_modules/jsonwebtoken/sign.js:107:20)
    at JwtService.sign (/Users/user/dev/backend/pol-api/node_modules/@nestjs/jwt/dist/jwt.service.js:28:20)
    at AuthService.login (/Users/user/dev/backend/pol-api/src/auth/auth.service.ts:26:37)
    at AuthController.login (/Users/user/dev/backend/pol-api/src/auth/auth.controller.ts:29:29)
    at /Users/user/dev/backend/pol-api/node_modules/@nestjs/core/router/router-execution-context.js:38:29
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at /Users/user/dev/backend/pol-api/node_modules/@nestjs/core/router/router-execution-context.js:46:28
    at /Users/user/dev/backend/pol-api/node_modules/@nestjs/core/router/router-proxy.js:9:17
Run Code Online (Sandbox Code Playgroud)

正如我所说,我尝试了在其他类似问题中找到的不同潜在解决方案(例如这个),但没有一个答案对我有用。

小智 10

我参加聚会迟到了,但我只是想办法解决这个问题,然后找到了解决方案。

问题可能出在 app.module.ts 中的这一行:

providers: [UsersService, AuthService, PolsService, JwtService],
Run Code Online (Sandbox Code Playgroud)

JwtService 不应添加为提供者。如果这样做,它似乎会重置所有已注册的选项。