为什么dotenv会给我的环境变量追加「#tunnel」后缀?
问题原因分析
- 优先级冲突:
dotenv默认遵循「不覆盖已存在的环境变量」规则,如果你的Shell会话、系统配置、项目启动脚本中已经提前定义了POSTGRESQL_URL这个变量,.env文件中的赋值会直接被跳过。你看到的localhost #tunnel实际是提前存在的旧环境变量值,和你当前是否开启隧道没有关联。 - .env文件内容异常:肉眼可见的内容不等于文件实际存储内容,有可能是编辑时误输入了隐藏字符、尾随的空格加注释内容,没有被你察觉到。
排查步骤
- 先在加载dotenv之前打印环境变量,确认是否提前存在值:
console.log('加载dotenv前的值:', process.env.POSTGRESQL_URL) const dotenv = require('dotenv'); dotenv.config(); console.log('加载dotenv后的值:', process.env.POSTGRESQL_URL)
如果打印的第一个值就已经是localhost #tunnel,就能确认是已有环境变量冲突的问题。
2. 检查系统/Shell的环境变量配置:查看~/.bashrc、~/.zshrc、~/.profile等配置文件,是否有export POSTGRESQL_URL="localhost #tunnel"这类配置,注意如果值被引号包裹,#不会被识别为注释,会作为值的一部分生效。
3. 检查项目启动配置:查看package.json的scripts字段、项目启动脚本,是否有在启动命令中提前注入了该环境变量。
4. 确认.env文件实际内容:执行cat -A .env命令查看文件的原始字节内容,确认POSTGRESQL_URL=localhost后面是否有多余的尾随字符。
解决方法
如果确认是已有环境变量冲突,需要让.env文件的配置优先级更高,可以修改dotenv的加载配置,开启覆盖模式:
dotenv.config({ override: true })
内容的提问来源于stack exchange,提问作者Steve Bennett
相关产品推荐
相关产品推荐

