gpt4 book ai didi

nestjs - NestJS 中的环境变量在每个模块中都不可见?

转载 作者:行者123 更新时间:2023-12-05 00:56:53 26 4
gpt4 key购买 nike

我在开发应用程序时将配置保存在 .env 文件中。

这是我的 app.module.ts:

@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRoot({
autoLoadEntities: true,
database: process.env.TYPEORM_DATABASE,
host: process.env.TYPEORM_HOST,
password: process.env.TYPEORM_PASSWORD,
port: (process.env.TYPEORM_PORT as unknown) as number,
type: 'postgres',
username: process.env.TYPEORM_USERNAME,
}),
AuthModule,
(...)
],
controllers: [],
providers: [],
})
export class AppModule {}

并且 typeorm 使用来自 process.env.TYPEORM_... 变量的正确值。

这是我的 auth.module.ts:

@Module({
providers: [JwtStrategy, (...)],
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET,
(...)
}),
(...)
],
controllers: [AuthController],
})
export class AuthModule {}

我从 JwtModule 收到错误,即 secret 不能为空。当然 JWT_SECRET 是在 .env 文件中设置的。

这是我的jwt.strategy.ts:

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
secretOrKey: process.env.JWT_SECRET,
(...)
});
}
(...)
}

在这里,process.env.JWT_SECRET 已正确加载。

我不明白为什么我的 env var 在我的应用中并非随处可用。

最佳答案

如果我不得不猜测,您调用 dotenvconfig() 方法为时已晚。在 Typescript 中,装饰器在模块导入时运行,因此 @Module() 中的任何内容几乎都会立即运行。但是,在调用该函数之前,不会运行类方法的函数调用中的任何内容。我建议,在您的 main.ts 文件中,将这些作为前两行:

import { config } from 'dotenv';
config();

这样,任何 .env 文件都会在其他任何东西有机会运行之前被读取并添加到 process.env

另一个选项,因为您使用的是 ConfigModule provided by Nest , 是使用异步注册过程,您可以使用工厂或类来提供正确的配置。在您的 TypeOrm 配置中,异步注册过程可能如下所示:

TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
autoLoadEntities: true,
database: config.get<string>('TYPEORM_DATABASE'),
host: config.get<string>('TYPEORM_HOST'),
password: config.get<string>('TYPEORM_PASSWORD'),
port: config.get<number>('TYPEORM_PORT'),
type: 'postgres',
username: config.get<string>('TYPEORM_USERNAME'),
})
})

关于nestjs - NestJS 中的环境变量在每个模块中都不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61413914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com