在 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.ts
和 app.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 语句
如何使用 Typescript Vue 组件向外部公开数据?
preload.ts 中的 contextBridge.exposeInMainWorld:ipcRenderer 接收到来自 main.ts 的消息但渲染器没有得到它