国庆活动:订阅年付会员送 6 个月,重订、续订送 12 个月。订阅 →

Nest.js:配置(文档)

应用都会在多种环境中运行,根据不同的环境,应用可能需要使用不同的配置。比如应用在本地与生产环境可能会使用不同的数据库配置信息。用 .env 文件可以实现。我们可以创建一个 ConfigModule  配置,里面有个 ConfigService 服务,用它加载配置的值。

安装

一些平台会自动把环境变量附加到 process.env 全局。不过在本地环境上我们得手工处理一下,解析环境变量文件可以使用 dotenv 这个包。

npm install dotenv --save
npm insatll @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) {}
  }
}


微信好友

用微信扫描二维码,
加我好友。



微信公众号

用微信扫描二维码,
订阅宁皓网公众号。



240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

11228
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点