2-配置设置

5 阅读1分钟

nest中多配置

@nestjs/config

  1. 安装依赖 npm install --save @nestjs/config
  2. 在根模块中引入ConfigModule.forRoot()
  3. 在需要使用配置的模块中引入ConfigModule,并使用ConfigService获取配置

安装 cross-env,设置环境变量

  1. 安装 npm install --save cross-env
  2. package.json中配置启动命令
  3. 根目录创建 .env .env.develop .env.production 文件,配置环境变量
"scripts": {
  "start": "cross-env NODE_ENV=development nest start --watch",
  "start:dev": "cross-env NODE_ENV=development nest start --watch",
  "start:prod": "cross-env NODE_ENV=production nest start"
}
  1. 在 app.module.ts 中使用 ConfigModule.forRoot() 配置环境变量
  2. 安装 npm i --save dotenv
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import * as dotenv from 'dotenv'; // 引入 dotenv 模块

const envFilePath = `.env.${process.env.NODE_ENV || 'development'}`; // 根据环境变量加载不同的配置文件

@Module({
  imports: [
    // 配置模块
    ConfigModule.forRoot({
      isGlobal: true, // 设置为全局模块
      envFilePath, // 加载配置文件
      load: [() => dotenv.config({ path: '.env' })], // 加载自定义配置文件,这里是加载 .env 文件然后.env.development 文件如果相同的则会覆盖
      // .env文件中
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
  providers: [ConfigService, AppService],
})
export class AppModule {}

读取yaml配置

  1. npm i --save js-yaml
  2. 在根目录下创建 config 文件夹,并在其中创建 config.yaml 文件
  3. package.json 中添加脚本
  4. 需要安装 npm i --save @nestjs/config cross-env lodash
"scripts": {
  "start": "cross-env NODE_ENV=development nest start --watch",
  "start:prod": "cross-env NODE_ENV=production node dist/main"
}
// configuration.ts 配置获取文件
// 读取配置文件
import { readFileSync } from 'fs';

import * as yaml from 'js-yaml';
import { join } from 'path';
import * as lodash from 'lodash';

const YAML_CONFIG_FILENAME = 'config.yaml';
const fileDefaultPath = join(__dirname, '../config', YAML_CONFIG_FILENAME); // 默认配置文件路径
const filePath = join(__dirname, `../config/${process.env.NODE_ENV}.yaml`); // 根据环境变量读取不同的配置文件

// 因为ConfigModule模块有一个load方法,所以这里用export default 一个函数,返回配置文件
export default () => {
  // 合并默认配置文件和自定义配置文件
  const defaultConfig = yaml.safeLoad(readFileSync(fileDefaultPath, 'utf8'));
  const customConfig = yaml.safeLoad(readFileSync(filePath, 'utf8'));
  return lodash.merge(defaultConfig, customConfig);
};
// app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import Configuration from './configuration'; // 引入配置文件

const envFilePath = `.env.${process.env.NODE_ENV || 'development'}.yaml`; // 根据环境变量加载不同的配置文件

@Module({
  imports: [
    // 配置模块
    ConfigModule.forRoot({
      isGlobal: true, // 设置为全局模块
      load: [Configuration], // 加载自定义配置文件
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
  providers: [ConfigService, AppService],
})
export class AppModule {}

如果还需要对配置项进行校验需要 引入 joi