在 main.ts 中使用 .env 文件中的数据 - NestJS

Posted

技术标签:

【中文标题】在 main.ts 中使用 .env 文件中的数据 - NestJS【英文标题】:Use data from .env file in main.ts - NestJS 【发布时间】:2021-06-01 12:59:25 【问题描述】:

NestJS 允许我们通过 ConfigModule 读取 .env 文件,我可以使用如下代码在我的模块中轻松做到这一点

@Module(
  imports: [ConfigModule.forRoot()],
  providers: [
    NVFullNameSearchService,
    NVPartialNameSearchService,
    NVPersistService,
  ],
  controllers: [NvController],
)

但上面的代码更多是在模块中处理,我如何从 main.ts 中的 .env 文件中读取内容。假设我需要为我的 Redis 服务设置端口和主机?

const microserviceOptions = 
  name: 'plscorecard',
  transport: Transport.REDIS,
  options: 
    url: 'redis://localhost:6379',
  ,
;
async function bootstrap() 
  const app = await NestFactory.createMicroservice(
    NVModule,
    microserviceOptions,
  );
  app.listen(() => 
    logger.log('NameVerification Redis microservice is listening ... ');
  );

bootstrap();

如您所见,在这种情况下尚未创建应用程序。我应该直接使用dotenv吗?正如您在任何企业环境中所期望的那样,我有用于 DEV、QA、UAT 和生产的不同 env 文件。实现它的最简单/正确的方法是什么?

【问题讨论】:

你试过nestjs's docs covers的方法吗? 这能回答你的问题吗? How to use config module on main.ts file Nest 有一个文档会话:docs.nestjs.com/techniques/configuration#using-in-the-maints 【参考方案1】:

感谢大家的支持。这是我修复它的方法

**app.module.ts**
import  Module  from '@nestjs/common';
import  AppController  from './app.controller';
import  AppService  from './app.service';
import  ConfigModule  from '@nestjs/config';

@Module(
  imports: [
    ConfigModule.forRoot(
      isGlobal: true,
      envFilePath: `config/$process.env.NODE_ENV.env`,
    ),
  ],
  controllers: [AppController],
  providers: [AppService],
)
export class AppModule 

模块现在有了正确的设置,剩下的就是从 main.ts 以一种更非传统但有记录的方式调用它

**main.ts**
import  Logger  from '@nestjs/common';
import  NestFactory  from '@nestjs/core';
import  Transport  from '@nestjs/microservices';
import  AppModule  from './app.module';
import  ConfigService  from '@nestjs/config';

async function bootstrap() 
  const logger = new Logger('main');
  const app = await NestFactory.create(AppModule);
  const configService = app.get(ConfigService);
  const REDIS_HOST = configService.get<string>('REDIS_HOST');
  const REDIS_PORT = configService.get<number>('REDIS_PORT');
  const microserviceOptions = 
    transport: Transport.REDIS,
    options: 
      url: `redis://$REDIS_HOST:$REDIS_PORT`,
    ,
  ;
  app.connectMicroservice(microserviceOptions);
  const PORT = configService.get<number>('PORT');
  const environment = configService.get<string>('NODE_ENV');
  const title = configService.get<string>('ENVIRONMENT_TITLE');
  await app.listen(PORT);
  logger.log(
    `$environment, Microservice ready to receive Redis messages in PORT - $PORT\n Environment - $title`,
  );

bootstrap();

【讨论】:

【参考方案2】:

您可以避免在 main.tsapp.get() 方法中使用配置服务来使用 dotenv

import  ConfigurationService  from './core/configuration/configuration.service';

async function bootstrap() 
  const configurationService = app.get(ConfigurationService);

  await app.listen(configurationService.expressPort);

如需了解更多信息,请阅读documentation about using configuration in your main.ts

【讨论】:

【参考方案3】:

最简单的解决方案实际上是导入 dotenv 并在之后立即对其进行初始化。尤其重要的是,这是您在 main.ts 中执行的前两件事,如下所示:

import * as dotenv from 'dotenv';
dotenv.config();
import ...
...
async function bootstrap()
...

完成此操作后,无需配置模块即可访问 .env 文件中的变量。

【讨论】:

以上是关于在 main.ts 中使用 .env 文件中的数据 - NestJS的主要内容,如果未能解决你的问题,请参考以下文章

Storybook main.ts:不能在模块外使用 import 语句

Nrwl Nx 构建节点项目仅转译 main.ts

如何在 NestJS 中正确设置配置?

究竟是啥触发了 Angular 中的 main.ts

如何使用 Typescript Vue 组件向外部公开数据?

preload.ts 中的 contextBridge.exposeInMainWorld:ipcRenderer 接收到来自 main.ts 的消息但渲染器没有得到它