应用程序通常在不同的环境中运行。根据环境的不同,应该使用不同的配置设置。例如,通常本地环境依赖于特定的数据库凭据,仅对本地 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');