首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >[NestJs]:JwtModule.register()不起作用

[NestJs]:JwtModule.register()不起作用
EN

Stack Overflow用户
提问于 2022-06-15 13:15:20
回答 1查看 564关注 0票数 0

我在NestJs中使用JwtModule,并且看起来寄存器方法没有为我注入的服务设置secret属性。我得到了一个错误:在这里输入图像描述

下面是代码:

  • 注册JwtModule的Auth模块:
代码语言:javascript
复制
@Module({
  imports: [
    UserModule,
    PassportModule,
    JwtModule.register({
      secret: process.env.JWT_SECRET,
      signOptions: { expiresIn: '1w' },
    }),
  ],
  providers: [AuthService, BcryptService, LocalStrategy, JwtStrategy],
  controllers: [AuthController],
})
export class AuthModule {}
  • Auth,在这里我调用了login()方法:
代码语言:javascript
复制
@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @UseGuards(LocalGuard)
  @Post('/login')
  async login(@Request() request) {
    return this.authService.login(request.user);
  }
}
  • Auth服务,我称之为jwtService.sign()
代码语言:javascript
复制
@Injectable()
export class AuthService {
  constructor(
    private readonly userService: UserService,
    private readonly bcryptService: BcryptService,
    private readonly jwtService: JwtService,
  ) {}

  async validateUser(email: string, password: string): Promise<User> {
    try {
      const user = await this.userService.findByEmail(email);
      await this.bcryptService.comparePassword(password, user.password);
      return user;
    } catch (err) {
      throw new HttpException(err.message, HttpStatus.UNAUTHORIZED);
    }
  }

  async login(user: User) {
    const payload = { userEmail: user.email, userId: user.id };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }
}

实际上,我必须像这样将options对象添加到jwtService.sign()中,这样才能使其工作:

代码语言:javascript
复制
  async login(user: User) {
    const payload = { userEmail: user.email, userId: user.id };
    return {
      access_token: this.jwtService.sign(payload, {
        secret: process.env.JWT_SECRET,
      }),
    };

我正在搜索“为什么寄存器方法不工作?”的解释,我希望不必在option方法中添加sign()对象。

为什么?

如果秘密没有被设定,过期是设定的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-16 18:44:20

引发的错误是由于process.env.JWT_SECRET未定义,因此导致auth模块中的secret。未定义env变量的原因是由于应用程序中的环境配置设置。

要使这个变量在auth模块中可以访问,您应该在auth模块中动态导入ConfigModule,或者像这样全局地定义它:

代码语言:javascript
复制
ConfigModule.forRoot({
  isGlobal: true,
});

一旦变量是可访问的,就不必在login方法中显式地定义它。是的,由于与环境变量配置无关,所以设置了到期时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72632136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档