NestJS项目配置.env环境变量遇到的坑

背景说明

开始学习 NestJS 框架, 在使用 nest cli 通过 nest new project 命令创建了一个项目, 在链接数据库的时候, 有一些配置项想要使用 .env 文件设置环境变量在项目里使用. 像其他项目一样, 在根目录分别创建 .env.development .env.production 两个文件, 文件内容分别为:

env 复制代码
# .env.development
DB_HOST=dev-db-server

# .env.production
DB_HOST=production-db-server

main.ts 里去导入使用:

ts 复制代码
import * as dotenv from 'dotenv';

dotenv.config();
console.log(process.env.DB_HOST);

这时, 打印为 undefined

解决

直接说结论:

  1. 确保安装了安装 dotenv

  2. 修改 package.json 里的配置项, 在 start:devstart:prod 命令里分别加上 NODE_ENV= + 环境名:

    json 复制代码
    "scripts": {
        "start:dev": "NODE_ENV=development nest start --watch",
        "start:prod": "NODE_ENV=production node dist/main"
    },
  3. 重启项目, 如果此时已经能按预期输出了, 那就恭喜你, 不用进行下面的操作了, 如果还不行, 继续下一步

  4. 不出意外这时候报错 'NODE_ENV' 不是内部或外部命令,也不是可运行的程序

    • 原因: 意味着在尝试执行 pnpm start:dev 命令时,系统无法识别 NODE_ENV 这个环境变量。这通常发生在 Windows 系统中,因为 Windows 的环境变量设置和 Unix/Linux 系统有所不同

    • 解决: 使用 cross-env 包来确保环境变量在所有平台上都能正确设置:

      js 复制代码
      pnpm add --save-dev cross-env
      # 或
      npm install --save-dev cross-env
  5. 安装好后, 再次修改 package.json 里的配置项, 在上一次修改的基础上, 分别在开头添加 cross-env

    json 复制代码
    "scripts": {
        "start:dev": "cross-env NODE_ENV=development nest start --watch",
        "start:prod": "cross-env NODE_ENV=production node dist/main"
    },
  6. 重新运行项目, 这时候环境变量打印的结果还是不理想(环境类型错乱 或 只读取.env 文件, 不读取对应环境类型), 可以在稍微改造一下 main.js :

js 复制代码
import * as dotenv from 'dotenv';

if (process.env.NODE_ENV === 'development') {
  dotenv.config({ path: '.env.development' }); // 加载开发环境 env 文件
} else if (process.env.NODE_ENV === 'production') {
  dotenv.config({ path: '.env.production' }); // 加载生产环境 env 文件
} else {
  dotenv.config(); // 加载默认的.env文件
}

console.log(process.env.NODE_ENV); // development
console.log(process.env.DB_HOST); // dev-db-server
  1. 大功告成, 继续愉快的开发吧!

各个包版本:

json 复制代码
  "dependencies": {
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/mapped-types": "*",
    "@nestjs/platform-express": "^10.0.0",
    "@nestjs/sequelize": "^10.0.1",
    "@nestjs/typeorm": "^10.0.2",
    "dotenv": "^16.4.5",
    "mysql2": "^3.9.4",
    "reflect-metadata": "^0.2.0",
    "rxjs": "^7.8.1",
  },
相关推荐
_jiang2 天前
nestjs 入门实战最强篇
redis·typescript·nestjs
敲代码的彭于晏5 天前
【Nest.js 10】JWT+Redis实现登录互踢
前端·后端·nestjs
前端小王hs18 天前
Nest通用工具函数执行顺序
javascript·后端·nestjs
明远湖之鱼20 天前
从入门到入门学习NestJS
前端·后端·nestjs
吃葡萄不吐番茄皮22 天前
从零开始学 NestJS(一):为什么要学习 Nest
前端·nestjs
东方小月23 天前
Vue3+NestJS实现权限管理系统(六):接口按钮权限控制
前端·后端·nestjs
白雾茫茫丶25 天前
Nest.js 实战 (十四):如何获取客户端真实 IP
nginx·nestjs
Spirited_Away1 个月前
Nest世界中的AOP
前端·node.js·nestjs
Eric_见嘉1 个月前
NestJS 🧑‍🍳 厨子必修课(六):Prisma 集成(下)
前端·后端·nestjs
kongxx2 个月前
NestJS中使用Guard实现路由保护
nestjs