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",
  },
相关推荐
东方小月1 天前
如何使用GitHub Actions自动部署我们的项目
前端·github·nestjs
泰伦闲鱼3 天前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
求知若饥4 天前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
白筱汐6 天前
Nestjs 和 Prisma 实现 Restful Api:JWT 授权
javascript·后端·nestjs
寻找奶酪的mouse15 天前
告诉自己,请给予时间一点点耐心~
年终总结·nestjs
Zhangxinxin1 个月前
从0~1手写Nest.js - (5) 配置路由
nestjs
YanceyOfficial1 个月前
How to deploy Nest.js microservices using Kubernetes
微服务·kubernetes·nestjs
webxue1 个月前
NestJS配置环境变量、读取Yaml配置的保姆级教程
node.js·nestjs
超级无敌暴龙兽2 个月前
微服务架构的基础与实践:构建灵活的分布式系统
微服务·node.js·nestjs
寻找奶酪的mouse2 个月前
【NestJS全栈之旅】应用篇:通用爬虫服务三两事儿
前端·后端·nestjs