Node CLI脚本读取同目录.env配置的环境变量为undefined的问题排查
核心原因
你现在读不到.env里的变量值,最关键的遗漏是:Node.js 原生运行时根本不会自动加载项目目录下的.env文件到process.env。
所有能直接用process.env读取.env内容的项目,都是提前通过代码触发了.env文件的解析、把文件里的键值对注入到进程环境变量的动作——很多人会把Web框架内置的自动env加载能力,误以为是Node原生支持的,纯Node CLI脚本是没有这个内置逻辑的。
具体修复步骤
- 第一步:在项目目录下安装通用的.env文件解析工具dotenv,执行
npm install dotenv - 第二步:修改index.js的代码结构,把dotenv的加载逻辑放在所有读取自定义环境变量的代码最开头,确保加载动作先于变量读取执行:
#!/usr/bin/env node // 必须放在所有用到process.env自定义变量的代码之前 require('dotenv').config(); // 以下为你原有业务代码 const fb = require('facebook-chat-api'); //debug only console.log(process.env.FB_EMAIL, process.env.FB_PWD) let credentials = { email: process.env.FB_EMAIL, password: process.env.FB_PWD } fb(credentials, (err, api) => { if(err) return console.log(err); console.log(api); });
常见踩坑提醒
- 加载顺序绝对不能错:Node代码是从上到下顺序执行的,如果把dotenv的加载代码放在读取环境变量的逻辑后面,执行到读取FB_EMAIL的代码时,还没触发.env文件的加载,依然会拿到undefined。
- 如果你是把这个CLI脚本安装为全局命令使用,dotenv默认会从你执行命令时的终端所在工作目录查找.env文件,不是脚本本身的安装路径。这种情况可以手动指定.env的绝对路径,保证不管从哪个目录启动命令都能正确读取:
// 通过__dirname定位脚本自身目录下的.env文件,不受终端工作目录影响 require('dotenv').config({ path: `${__dirname}/.env` }); - 你当前的.env文件内容写法、存放位置是符合dotenv解析规则的,不需要调整格式。
内容的提问来源于stack exchange,提问作者newbiedev
相关产品推荐
相关产品推荐

