Nest: 配置变量集,也就是全局变量

2019/06/05 21:09
阅读数 2.7K

文档

  1. 装依赖
$ npm i --save dotenv
$ npm i --save-dev @types/dotenv
$ npm install --save joi
$ npm install --save-dev @types/joi
  1. 创建文件
λ nest g mo config   创建一个config模块
CREATE /src/config/config.module.ts (83 bytes)

λ nest g s config  创建一个服务
CREATE /src/config/config.service.spec.ts (460 bytes)
CREATE /src/config/config.service.ts (90 bytes)

λ mkdir .env  在项目根目录创建
  1. 编写代码 config.service.ts
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);
  }

  /**
   * 确保设置所有需要的变量,并返回经过验证的JavaScript对象
   * 包括应用的默认值。
   */
  private validateInput(envConfig: EnvConfig): EnvConfig {
    const envVarsSchema: Joi.ObjectSchema = Joi.object({
      NODE_ENV: Joi.string()
        .valid(['development', 'production', 'test', 'provision'])
        .default(''),
      SERVER_PORT: Joi.number().default(3000),
    });

    const { error, value: validatedEnvConfig } = Joi.validate(
      envConfig,
      envVarsSchema,
    );
    if (error) {
      throw new Error(`Config validation error: ${error.message}`);
    }
    return validatedEnvConfig;
  }

  get port(): number {
    return Number(this.envConfig.SERVER_PORT);
  }
}

config.module.ts

import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({
  providers: [
    {
      provide: ConfigService,
    //   useValue: new ConfigService(`${process.env.NODE_ENV}.env`),
      useValue: new ConfigService(`.env`),
    },
  ],
  exports: [ConfigService],
})
export class ConfigModule {}

app.module.ts 导入ConfigModule

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

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

".env"

SERVER_PORT = 3000
  1. 使用
@Injectable()
export class AppService {
  constructor(public readonly config: ConfigService) {}

  weekVideo() {
    console.log(this.config.port); // 3000

    return [];
  }
}
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部