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",
  },
相关推荐
copyer_xyf2 天前
PostgreSQL 做向量检索:一条单库路线
数据库·agent·nestjs
Revolution612 天前
Nest.js 是什么:怎样用它写出第一个后端接口
后端·node.js·nestjs
濮水大叔4 天前
NestJS 与 CabloyJS 的 env/config 架构对比:从环境变量到实例级配置
前端·node.js·nestjs
Allshadow9 天前
Nest.js - 连接数据库
javascript·nestjs
Allshadow12 天前
Nest.js - 目录结构
javascript·nestjs
南一Nanyi13 天前
依赖注入和控制反转
前端·设计模式·nestjs
晓得迷路了14 天前
栗子前端技术周刊第 138 期 - NestJS 12、Astro 7.1、npm 12...
前端·javascript·nestjs
xiaofeichaichai16 天前
NestJS 实战:JWT 登录认证、Token 刷新与安全退出
redis·nestjs·jwt·twitter
无双_Joney18 天前
[四期 - 4] NestJS专栏 - 征召一下大家的意见,非常想知道大家都想看看Nest的哪些方面
前端·后端·nestjs
糖墨夕19 天前
AI Agent技术栈选择:Vue3 + NestJS + TypeScript 为什么是绝佳组合
前端·nestjs