我在NestJs中使用JwtModule,并且看起来寄存器方法没有为我注入的服务设置secret属性。我得到了一个错误:在这里输入图像描述
下面是代码:
@Module({
imports: [
UserModule,
PassportModule,
JwtModule.register({
secret: process.env.JWT_SECRET,
signOptions: { expiresIn: '1w' },
}),
],
providers: [AuthService, BcryptService, LocalStrategy, JwtStrategy],
controllers: [AuthController],
})
export class AuthModule {}login()方法:@Controller('auth')
export class AuthController {
constructor(private readonly authService: AuthService) {}
@UseGuards(LocalGuard)
@Post('/login')
async login(@Request() request) {
return this.authService.login(request.user);
}
}jwtService.sign()@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()中,这样才能使其工作:
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()对象。
为什么?
如果秘密没有被设定,过期是设定的吗?
发布于 2022-06-16 18:44:20
引发的错误是由于process.env.JWT_SECRET未定义,因此导致auth模块中的secret。未定义env变量的原因是由于应用程序中的环境配置设置。
要使这个变量在auth模块中可以访问,您应该在auth模块中动态导入ConfigModule,或者像这样全局地定义它:
ConfigModule.forRoot({
isGlobal: true,
});一旦变量是可访问的,就不必在login方法中显式地定义它。是的,由于与环境变量配置无关,所以设置了到期时间。
https://stackoverflow.com/questions/72632136
复制相似问题