NestJS 配置

91 阅读2分钟

应用程序通常在不同的环境中运行。根据环境的不同,应该使用不同的配置设置。例如,通常本地环境依赖于特定的数据库凭据,仅对本地 DB 实例有效。生产环境将使用一组单独的 DB 凭据。由于配置变量会更改,所以最佳实践是将配置变量存储在环境中。

安装

我们首先安装所需的依赖项。注意 @nestjs/config 内部使用 dotenv 实现。

$ npm i --save @nestjs/config

使用

在根模块AppModule中,导入ConfigModule模块,并使用.forRoot()静态方法导入它的配置。

默认位置(项目根目录)载入并解析一个.env文件,从.env文件和process.env合并环境变量键值对,并将结果存储到一个可以通过ConfigService访问的私有结构。

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot()],
})
export class AppModule {}

.env文件

DATABASE_USER=test
DATABASE_PASSWORD=test

自定义 env 文件路径

ConfigModule.forRoot({
  envFilePath: '.development.env',
});

//多个文件//////////////
ConfigModule.forRoot({
  envFilePath: ['.env.development.local', '.env.development'],
});

全局使用

当您想在其他模块中使用ConfigModule时,需要将其导入(这是任何 Nest 模块的标准配置)。 或者,通过将options对象的isGlobal属性设置为true,将其声明为全局模块,如下所示。 在这种情况下,将ConfigModule加载到根模块(例如AppModule)后,您无需在其他模块中导入它。

ConfigModule.forRoot({
  isGlobal: true,
});

使用 ConfigService

现在您可以简单地在任何地方注入 ConfigService ,并根据传递的密钥检索特定的配置值。 要从 ConfigService 访问环境变量,我们需要注入它。因此我们首先需要导入该模块。与任何提供程序一样,我们需要将其包含模块ConfigModule导入到将使用它的模块中(除非您将传递给ConfigModule.forRoot()方法的 options 对象中的isGlobal属性设置为true)。

// feature.module.ts
@Module({
  imports: [ConfigModule],
  ...
})

然后我们可以使用标准的构造函数注入:

constructor(private configService: ConfigService) {}

// get an environment variable
const dbUser = this.configService.get<string>('DATABASE_USER');
// get a custom configuration value
const dbHost = this.configService.get<string>('database.host');

// 默认值
const dbHost = this.configService.get<string>('database.host', 'localhost');