问题描述
在 Node.js
项目中通过 .env
文件 dotenv
包来区分环境变量是非常常见的操作,最近在一台 Windows
系统新机下的项目中通过该方法获取 process.env.HOSTNAME
与 .env
文件配置不同,获取的一直是诸如 PC-20220512JLFP
之类的系统主机名,但是其他名称的环境变量又能正常获取,于是开始了以下的排查之旅。.env
文件
HOSTNAME=domain.com
app.js
文件
require('dotenv').config()
console.log('process.env.HOSTNAME', process.env.HOSTNAME)
输出
"PC-20220512JLFP"
问题排查
1. Node
版本问题
先排除是不是 Node.js
版本问题,通过 nvm
切换版本发现在不同版本下获取的值都是一样的,排除该原因
nvm install 16.17.1
nvm use 16.17.1
nvm install 14.20.1
nvm use 14.20.1
2. 直接通过 Node REPL
查看 process.env
中的值
node
可以看到在未加载任何自定义环境变量情况下 Node.js
中的 process.env.HOSTNAME
已经存在了值并且可能设置为了系统主机名称
这里我们可以怀疑是否 dotenv
没获取到这个值或者还是使用了默认环境下的值,于是将 dotenv
获取到的环境变量打印出来
const config = require('dotenv').config()
console.log('config', config)
但是从打印结果来看 dotenv
获取到了 .env
文件中配置的值,这里基本可以确定问题原因应该是和优先级之类的有关
问题解决
解决方法一:设置 dotenv
覆盖已有系统环境变量
通过翻看文档可以得知 dotenv
默认行为是不会覆盖已有的系统环境变量的,可以配置修改这一行为
require('dotenv').config({ override: true })
解决方法二:修改系统环境变量
process.env.HOSTNAME
这个环境变量在一些 Windows
系统下会存在是主机名称的默认值,可以修改主机名称去除这一环境变量