
Node.js 默认不读取 .env 文件,即使 Shell 中已通过 source .env 设置了环境变量,process.env 仍无法自动继承;需借助 dotenv 包显式加载,并确保在应用启动前调用 config()。
node.js 默认不读取 `.env` 文件,即使 shell 中已通过 `source .env` 设置了环境变量,`process.env` 仍无法自动继承;需借助 `dotenv` 包显式加载,并确保在应用启动前调用 `config()`。
在 Node.js 开发中,.env 文件是管理敏感配置(如端口、数据库 URL、API 密钥)的常用方式。但一个常见误区是:在终端中执行 source .env 后,认为这些变量会自动注入到 Node.js 进程中。实际上,source 仅将变量注入当前 Shell 环境,而 Node.js 子进程默认不会继承所有 Shell 变量(尤其当以非交互式方式启动时),更关键的是——.env 文件本身并非系统级环境配置,Node.js 完全不感知其存在。
要真正让 process.env.PORT 在代码中可用,必须显式加载并解析 .env 文件。推荐使用官方维护的 dotenv 包:
✅ 正确做法:集成 dotenv
-
安装依赖
npm install dotenv
-
在入口文件(如 index.js 或 app.js)顶部立即加载
⚠️ 注意:必须在任何依赖 process.env 的代码(如 app.listen())之前调用 dotenv.config():// index.js require('dotenv').config(); // ← 必须放在最上方! const express = require('express'); const app = express(); const PORT = process.env.PORT || 3000; if (!process.env.PORT) { throw new Error('Missing PORT in environment variables'); } app.listen(PORT, () => { console.log(`✅ Server running on http://localhost:${PORT}`); }); -
确保 .env 文件位于项目根目录(与 package.json 同级),内容格式为纯键值对(无空格、无引号):
PORT=5000 NODE_ENV=development DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
❌ 常见错误与说明
- source .env 无法影响 Node.js 进程:该命令仅修改当前 Shell 的环境,Node.js 启动时会创建独立进程,除非显式传递(如 PORT=5000 node index.js),否则不会继承。
- dotenv.config() 调用位置错误:若放在 require 表达式之后或 app.listen() 之后,变量尚未加载,校验必然失败。
- 未重启服务:修改 .env 或引入 dotenv 后,必须重启 Node.js 进程(如 Ctrl+C → npm start),热重载工具(如 nodemon)通常能自动检测 .env 变更,但仍建议明确重启确认。
-
路径问题:若 .env 不在根目录,需指定路径:
require('dotenv').config({ path: './config/.env' });
? 验证是否生效
可在代码中添加调试日志:
console.log('Loaded ENV:', {
PORT: process.env.PORT,
NODE_ENV: process.env.NODE_ENV
});正常输出应为:
Loaded ENV: { PORT: '5000', NODE_ENV: 'development' }? 进阶提示:生产环境建议避免使用 .env 文件(应通过系统环境变量或云平台配置中心管理),dotenv 默认仅在 NODE_ENV !== 'production' 时启用,你也可通过 if (process.env.NODE_ENV !== 'production') require('dotenv').config(); 显式控制。
遵循以上步骤,即可确保 process.env.PORT 稳定可用,彻底解决“环境变量始终为 undefined”的问题。










