nestjs环境变量配置(多环境配置)

1,538 阅读2分钟

微信图片-20200818111752.jpg

背景

nestjs项目在安装@nestjs/config后,官方文档对于具体的环境变量的设置以及多环境(开发、测试、生产)的配置解释的不够具体,这里进行总结下,做个记录。

准备

  1. 安装依赖包@nestjs/config(官方推荐的默认使用dotenv来管理配置文件的)、cross-env
  2. 修改的文件包含app.module.ts、main.ts、package.json;
  3. 新增的文件包括.env文件、config文件夹、src/config/configuration.ts文件
    npm i @nestjs/config cross-env

步骤及注意点

  1. 在src目录下新建config/configuration.ts文件(这里自己可以自由新建配置文件)

  2. 采用@nestjs/config的配置后,就不会采取平时在框架里面采用的.env.env.development.env.production这样的环境变量文件进行配置了。主要是在js文件里面对变量进行配置,官方也可以通过ignoreEnvFile: true进行关闭默认取env的策略

  3. 在configuration.ts文件里编写自定义的配置项,可以分环境来写,具体如下示例。

  4. 配置写完,在package.json里面启动项的时候添加自定义环境变量,区分开发及生产命令 "start": "cross-env RUNNING_ENV=dev nest start","start:prod": "cross-env RUNNING_ENV=prod node dist/main"这样在项目启动或编译的时候就会注入环境变量,在configuration.ts配置里面读取对应不同环境下的配置

  5. 在appModule.ts里面进行模块注入,这里官方文档有详细的描述。

  6. 如果在appMoudle.ts里面有引入数据库及其他的模块,需要单独维护配置的,可以看下面配置文件

  7. main.ts里面有相关配置维护的,也可以按照官网配置

各文件配置

configuration.ts文件

# 这里只做最简单多环境的配置,复杂的配置根据业务环境来配置
# 新建开发环境的配置
export const CONFIG_DEV = {
  port: 3000,  # 这里的一些变量都可以配置在.env里面
  mongo: {
    uri: 'mongodb://10.10.10.10:27017/copy',
    user: 'copy',
    pass: 'copy',
    autoIndex: false,
  },
};
# 新建生产环境配置
export const CONFIG_PROD = {
  port: 80,
  mongo: {
    uri: 'mongodb://10.10.10.10:27017/copy',
    user: 'copy',
    pass: 'copy',
    autoIndex: false,
  },
};

# 根据环境变量,来判断返回什么样的环境变量
export default () => {
  const env = process.env.RUNNING_ENV;
  console.log(process.env);
  return env === 'dev' ? CONFIG_DEV : CONFIG_PROD;
};

appModule.ts

import { ConfigModule, ConfigService } from '@nestjs/config';
# 一些小demo
imports: [
    ConfigModule.forRoot({
    # 可以通过全局配置,这样在其他模块直接可以引入ConfigService,进行依赖注入
      isGlobal: true,
      load: [configuration],
    }),
    # 这边要主要通过forRootAsync异步来配置
    MongooseModule.forRootAsync({
      imports: [ConfigModule],
      async useFactory(configService: ConfigService) {
    # 通过service获取到配置信息
        const connectOption = configService.get('mongo');
        return {
          ...connectOption,
        };
      },
      inject: [ConfigService],
    })
  ],