NestJs 不读取环境变量

时间:2021-05-11 08:16:00

标签: node.js typescript environment-variables nestjs dotenv

我按照 Nest documentation 创建配置,但它不起作用

app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRoot(config),
    AuthModule,
    UsersModule,
    MailModule,
    CloudinaryModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})

.env 文件位于 src 文件夹中

ma​​il.module.ts

@Module({
  imports: [
    MailerModule.forRoot({
      transport: {
        service: 'Gmail',
        auth: {
          user: process.env.MAIL_USER,
          pass: process.env.MAIL_PASS,
        },
      },
    }),
  ],

但是当我运行应用程序时,它的未定义我的键值对也在那里。

1 个答案:

答案 0 :(得分:1)

问题是 ConfigModule 的 env 变量仅在运行时可用,而在 nestjs 初始状态时不可用。

要允许在 nestjs 初始化后获取 .env,您可以在 MailerModule 中使用异步配置。

ma​​il.config.ts

export class MailerConfig implements MailerOptionsFactory {
  createMailerOptions(): MailerOptions | Promise<MailerOptions> {
    console.log(process.env.MAIL_USER); // should have value
    return {
      transport: {
        service: 'Gmail',
        auth: {
          user: process.env.MAIL_USER,
          pass: process.env.MAIL_PASS,
        },
      },
    };
  }
}

ma​​il.module.ts

console.log(process.env.MAIL_USER); // undefined
@Module({
  imports: [
    MailerModule.forRootAsync({
      useClass: MailerConfig,
    }),
  ],
})
export class MailModule {}

你也可以使用 useFactory 而无需类,在这里我想控制台.log .env 供你检查,所以我使用了配置类。

相关问题