Windows10下Node.js中process.env.USERNAME读取主机名而非自定义变量的问题
问题解答
一、USERNAME/username读取到主机名的原因
没错,这就是系统环境变量冲突导致的。Windows系统默认自带USERNAME环境变量,存储的是当前登录的用户名(你看到的“主机名”其实是当前登录账户的名称)。而且Windows的环境变量是大小写不敏感的,不管你写USERNAME还是username,都会指向系统自带的这个变量。
哪怕你在dotenv配置里加了override: true,也没法覆盖Windows的系统级环境变量——因为这些系统变量在Node.js进程启动时就已经被加载到process.env中,优先级高于你自定义的.env变量。而USER_NAME这种带下划线的命名,系统没有内置同名变量,所以能正常读取你设置的值。
二、Node.js中定义用户名、密码的规范做法
- 加项目专属前缀:给自定义环境变量加上项目独有的前缀,比如
MYAPP_DB_USER、MYAPP_DB_PASS,从根源上避免和系统环境变量重名。 - 遵循全大写+下划线命名:环境变量的通用惯例是全大写,单词之间用下划线分隔,比如
API_USERNAME、API_PASSWORD,可读性更强,也符合大多数项目的规范。 - 严格保护敏感信息:一定要把
.env文件加入.gitignore,绝对不能把包含密码、密钥的配置文件提交到代码仓库。 - 区分环境配置:针对开发、测试、生产环境分别创建
.env.development、.env.production等文件,用dotenv-flow这类工具自动加载对应环境的配置。
你的代码示例
app.js
const express = require('express') const app = express(); const dotenv = require('dotenv') // 设置服务器端口 dotenv.config({ path: './utils/config.env', override: true }) console.log(`*** Username: ${process.env.USERNAME}`) console.log(`*** Username: ${process.env.USER_NAME}`) console.log(`*** Username: ${process.env.UNAME}`) console.log(`*** Password: ${process.env.password}`) const PORT = process.env.PORT; app.listen(PORT, () => { console.log(`Server has started on port: ${process.env.PORT} in ${process.env.NODE_ENV} mode.`) })
config.env
PORT = 3000 NODE_ENV = development USERNAME = USERNAME1 USER_NAME = USERNAME2 UNAME = USERNAME3 password = password@123
内容的提问来源于stack exchange,提问作者elysium
相关产品推荐
相关产品推荐

