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",
  },
相关推荐
Eric_见嘉4 天前
NestJS 🧑‍🍳 厨子必修课(六):Prisma 集成(下)
前端·后端·nestjs
kongxx20 天前
NestJS中使用Guard实现路由保护
nestjs
白雾茫茫丶21 天前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
nestjs·nest.js·发布订阅·event emitter
lph65822 个月前
比起上传资源更应该懂得如何资源回收
node.js·nestjs
gsls2008082 个月前
将nestjs项目迁移到阿里云函数
阿里云·云计算·nestjs·云函数
d3126975102 个月前
在Nestjs使用mysql和typeorm
mysql·express·nestjs·typeorm
剪刀石头布啊2 个月前
nestjs-版本控制
nestjs
潇洒哥gg2 个月前
重生之我在NestJS中使用jwt鉴权
前端·javascript·nestjs
huangkaihao3 个月前
【NestJS学习笔记】 之 自定义装饰器
前端·node.js·nestjs
鹿鹿鹿鹿isNotDefined3 个月前
Nest 源码解析:依赖注入是怎么实现的?
nestjs