nestjs 环境变量解决方案

方案一:env 配置文件

特点:不可以嵌套

一、安装和配置环境变量
  1. 在 nestjs 项目中安装依赖
npm install @nestjs/config cross-env -D --registry=https://registry.npmmirror.com
  1. 修改 package.json 脚本,指定环境区分变量
  {
    "start:dev": "cross-env NODE_ENV=development nest build --webpack --webpackPath webpack-hmr.config.js --watch",
    "dev": "cross-env NODE_ENV=development nest build --webpack --webpackPath webpack-hmr.config.js --watch",
    "start:prod": "cross-env NODE_ENV=production node dist/main",
    "build": "cross-env NODE_ENV=production nest build",
  }
  1. 创建 src/utils/env.ts,根据环境组合最终文件路径
const envFilePath = ['.env'];
if (process.env.NODE_ENV === 'development') {
  envFilePath.unshift('.env.development');
}

if (process.env.NODE_ENV === 'production') {
  envFilePath.unshift('.env.production');
}

export default envFilePath;
  1. 在 src/app.module.ts 中注册环境变量
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import envFilePath from '@/utils/env';
@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  1. 公共环境变量配置,创建 .env
    此文件变量优先级最低,合并后同名环境变量会被替换掉
NAME = nestjs
POSITION = env
  1. 创建开发环境变量配置,创建 .env.development
POSITION = env.development
API_URL = http://localhost:3000
  1. 创建生产环境变量配置,创建 .env.production
POSITION = env.production
API_URL = http://localhost:9000
二、测试
  1. 在 src/app.controller.ts 的路由中打印环境变量
import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get('/datamanager/s/getCatalogTree')
  getTree(): string {
    console.log(process.env);
    return this.appService.getCatalogTree();
  }

  @Post('/datamanager/s/postUserInfo')
  create(): string {
    return this.appService.createUserInfo();
  }
}
  1. 启动开发服务
npm run dev
  1. 浏览器访问测试路由
http://localhost:3000/datamanager/s/getCatalogTree
  1. 控制台打印结果
  ... // 其他变量
  NODE_ENV: 'development',
  NAME: 'nestjs',
  POSITION: 'env.development',
  API_URL: 'http://localhost:3000'

方案二:json 配置文件

特点:可以嵌套

一、安装配置环境变量
  1. 在 nestjs 项目中安装依赖
npm install config cross-env -D --registry=https://registry.npmmirror.com
  1. 在根目录创建默认环境变量文件 /config/default.json
    此配置文件优先级最低,最终会被合并覆盖
{
  "server": {
    "only_def": "def",
    "name": "default",
    "port": 3000
  }
}
  1. 在根目录创建 开发 环境变量文件 /config/development.json
{
  "server": {
    "only_dev": "dev",
    "name": "development",
    "port": 3000,
    "base_url": "/api"
  }
}
  1. 在根目录创建 生产 环境变量文件 /config/production.json
{
  "server": {
    "only_prod": "prod"
  }
}
  1. 修改 package.json
  "scripts": {
    "start:debug": "cross-env NODE_ENV=development start --debug --watch",
    "start:prod": "cross-env NODE_ENV=production node dist/main",
  },
二、测试
  1. 在 src/app.controller.ts 中
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import * as config from 'config';

@Controller('/api')
export class AppController {
  constructor(private readonly appService: AppService) {}
  @Get('/user')
  getHello(): string {
    console.log('====================================');
    console.log(config.get('server'));
    console.log('====================================');
    return this.appService.getHello();
  }
}
  1. 查看开发环境变量
    启动开发服务 npm run start:dev
    打开浏览器输入 http://localhost:3000/api/user
// 在控制台查看打印结果,如下
====================================
{
  only_def: 'def',
  name: 'development',
  port: 3000,
  only_dev: 'dev',
  base_url: '/api'
}
====================================
  1. 查看生产环境变量
    启动开发服务 npm run start:prod
    打开浏览器输入 http://localhost:3000/api/user
// 在控制台查看打印结果,如下
====================================
{ only_def: 'def', name: 'default', port: 3000, only_prod: 'prod' }
====================================
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容