应用都会在多种环境中运行,根据不同的环境,应用可能需要使用不同的配置。比如应用在本地与生产环境可能会使用不同的数据库配置信息。用 .env 文件可以实现。我们可以创建一个 ConfigModule 配置,里面有个 ConfigService 服务,用它加载配置的值。
安装
一些平台会自动把环境变量附加到 process.env 全局。不过在本地环境上我们得手工处理一下,解析环境变量文件可以使用 dotenv 这个包。
npm install dotenv --save npm install @types/dotenv --save-dev
服务
先创建一个 ConfigService 类。
import * as dotenv from 'dotenv'; import * as fs from 'fs'; export class ConfigService { private readonly envConfig: { [key: string]: string }; constructor(filePath: string) { this.envConfig = dotenv.parse(fs.readFileSync(filePath)) } get(key: string): string { return this.envConfig[key]; } }
filePath 就是 .env 文件的路径,envConfig 这个私有属性里包含的就是环境变量文件里的属性,用服务里的 get() 方法可以得到指定属性的值。
再去创建一个 ConfigModule。
import { Module } from '@nestjs/common'; import { ConfigService } from './config.service'; @Module({ providers: [ { provide: ConfigService, useValue: new ConfigService(`${process.env.NODE_ENV}.env`), }, ], exports: [ConfigService], }) export class ConfigModule {}
使用 ConfigService
要使用 ConfigService,先在模块里导入 ConfigModule:
@Module({ imports: [ConfigModule], })
注入使用:
@Injectable() export class AppService { private isAuthEnabled: boolean; constructor(config: ConfigService) { this.isAuthEnabled = config.get('IS_AUTH_ENABLED') === 'true'; } }
验证
用 Joi,先安装一下:
npm install joi --save npm install @types/joi --save-dev
改进 ConfigService:
import * as dotenv from 'dotenv'; import * as Joi from 'joi'; import * as fs from 'fs'; export interface EnvConfig { [key: string]: string; } export class ConfigService { private readonly envConfig: EnvConfig; constructor(filePath: string) { const config = dotenv.parse(fs.readFileSync(filePath)); this.envConfig = this.validateInput(config); } private validateInput(envConfig: EnvConfig): EnvConfig { const envVarsSchema: Joi.ObjectSchema = Joi.object({ NODE_ENV: Joi.string() .valid(['development', 'production', 'test', 'provision']) .default('development'), PORT: Joi.number().default(3000), API_AUTH_ENABLED: Joi.boolean().required(), }); const { error, value: validateEnvConfig } = Joi.validate( envConfig, envVarsSchema, ); if (error) { throw new Error(`Config validation error: ${error.message}`); } return validateEnvConfig; } }
类属性
每个配置属性可以添加一个 getter 函数。
get isApiAuthEnabled(): boolean { return Boolean(this.envConfig.API_AUTH_ENABLED); }
使用:
@Injectable() export class AppService { constructor(config: ConfigService) { if (config.isApiAuthEnabled) {} } }
评论
原来在这啊
4 年 11 个月 以前
安装命令 install 拼错了。。
4 年 5 个月 以前
收到 :)
4 年 5 个月 以前