nest.js 中的环境变量在 jwt.strategy.ts 中不可见
Posted
技术标签:
【中文标题】nest.js 中的环境变量在 jwt.strategy.ts 中不可见【英文标题】:Environment variable in nest.js is not visible in jwt.strategy.ts 【发布时间】:2021-07-11 17:47:59 【问题描述】:我正在尝试将环境变量传递给我的 jwt.stratgy.ts 文件,但变量在文件中不可见。如果我在 SecurityParameters 文件中硬编码 jwksUri 变量,它工作正常。由于某种原因,似乎 process.env 在 super(options) 甚至在 constructor() 中都不可见。希望有任何关于如何读取变量的指针。
我的 jwt.strategy.ts 如下所示:
import PassportStrategy from '@nestjs/passport';
import ExtractJwt, Strategy from 'passport-jwt';
import passportJwtSecret from 'jwks-rsa';
import SecurityParameters from '../auth.parameters' ;
import ConfigService from '@nestjs/config' ;
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy)
constructor( configService: ConfigService )
super(
secretOrKeyProvider: passportJwtSecret(
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: configService.get<string>('jwksUri'),
),
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
audience: SecurityParameters.audience ,
issuer: SecurityParameters.issuer,
ignoreExpiration: false,
algorithms: ['RS256'],
);
我的 SecurityParameters 文件如下所示:
export const SecurityParameters =
issuer : process.env.ISSUER ,
secret: process.env.SECRET ,
expiresin: process.env.EXPIRESIN,
jwksUri: process.env.JWKSURI,
;
我正在从 .env 文件加载环境文件并在 main.ts 中加载环境变量
import NestFactory from '@nestjs/core';
import SwaggerModule, DocumentBuilder from '@nestjs/swagger';
import AppModule from './app.module';
import * as dotenv from 'dotenv';
async function bootstrap()
const app = await NestFactory.create(AppModule);
await app.listen(port, () =>
console.log(`Listening on port $port`);
);
dotenv.config();
bootstrap();
我的 app.module.ts 如下所示
import Module from '@nestjs/common';
import UserModule from './user/user.module';
import ConfigModule from '@nestjs/config';
import AuthModule from './auth/auth.module';
import config from './auth/config';
let environment = process.env.NODE_ENV || 'local' ;
var module_names: Array<any> = [
AuthModule
]
if (environment=='local')
module_names.push(ConfigModule.forRoot(
isGlobal: true,
load: [config],
))
@Module(
imports:
module_names,
controllers: [],
providers: [],
)
export class AppModule
config.ts
const config = (): any =>
return
issuer : process.env.ISSUER ,
secret: process.env.SECRET ,
expiresin: process.env.EXPIRESIN,
jwksUri: process.env.JWKSURI,
;
;
export config ;
【问题讨论】:
【参考方案1】:As I just mentioned in your other question 你应该注入ConfigService
并使用configService.get()
而不是process.env
来获取你的环境变量。
【讨论】:
谢谢。我在 main.ts 中添加了 dotenv 方法,但它不起作用 import config from 'dotenv';配置()。由于某种原因,它使它在大多数模块中可用,但在构造函数()中不可用'无法添加配置服务,因为 this.configService.get('JWKSURI') 在 super() 构造函数中不可用。 没用:``` export class JwtStrategy extends PassportStrategy(Strategy) constructor( configService: ConfigService ) super( secretOrKeyProvider: passportJwtSecret( cache: true, rateLimit: true, jwksRequestsPerMinute: 5, jwksUri:configService.get以上是关于nest.js 中的环境变量在 jwt.strategy.ts 中不可见的主要内容,如果未能解决你的问题,请参考以下文章
使用nest.js在AWS Lambda中获取Cognito数据(即requestContext)
Nest.js 模型依赖注入与 Mongoose 没有构造函数
如何在 Nest.js 中删除 @ManyToMany 关系中的数据