应用都会在多种环境中运行,根据不同的环境,应用可能需要使用不同的配置。比如应用在本地与生产环境可能会使用不同的数据库配置信息。用 .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) {}
}
} 



评论
原来在这啊
5 年 10 个月 以前
安装命令 install 拼错了。。
5 年 5 个月 以前
收到 :)
5 年 5 个月 以前