1

我有一个关于设置环境变量的问题。

在官方文档中,它说在这种情况下使用 ConfigModule,但我的情况是一个例外情况。

因为我想在构造函数的 super() 中使用它。

我的代码如下。

在这种情况下有什么解决办法吗?

如果您需要更多信息,请告诉我。

谢谢大家的支持!!

// jwt.strategy.ts

import { UnauthorizedException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PassportStrategy } from '@nestjs/passport';
import { InjectRepository } from '@nestjs/typeorm';
import { Strategy, ExtractJwt } from 'passport-jwt';
import { JwtPayload } from './jwt-payload.interface';
import { UserRepository } from './user.repository';
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor(
        @InjectRepository(UserRepository)
        private userRepository: UserRepository,
        private configService: ConfigService,
    ) {
        super({
            jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
            secretOrKey: configService.get('JWT_TOKEN'),
        });
    }

    async validate(payload: JwtPayload) {
        const { username } = payload;
        const user = await this.userRepository.findOne({ username });

        if (!user) {
            throw new UnauthorizedException();
        }
        return user;
    }
}
4

3 回答 3

2

您需要将 configModule 导入到您的模块类中才能使 configService 工作。此外,在类名上方添加 @Injectable() 以表明它是提供者。

这就是您导入模块的方式。

//auth.module.ts    
    
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { JwtStrategy } from './jwt.strategy';

@Module({
  imports: [ConfigModule],
  provider:[JwtStrategy]
})
export class AuthModule {}

NestJs 解决了它们之间的依赖关系。

见:https ://docs.nestjs.com/techniques/configuration#using-the-configservice

于 2020-11-19T15:11:57.207 回答
2

对于您来说Strategy,您缺少@Injectable()which 告诉 Nest 它需要注入构造函数中定义的依赖项。

于 2020-11-19T15:04:56.207 回答
1

我还想指出,由于您没有使用configServiceanywhere,而是在super()调用中使用private它前面的关键字是多余的

您可以尝试使用this.configService.get('JWT_TOKEN'),但它只会对您大喊大叫,说您没有调用 super

删除 private 关键字将简单地避免将其configService作为类变量,并将其视为传递给它的某个选项

于 2022-01-11T10:38:15.997 回答