Dotenv 无法覆盖键值对

问题描述

我正在尝试在我的节点服务器上使用 dotenv 实现环境变量,但是我无法从位于根目录的 .env 文件中加载它们。当我运行 const dotenv = require("dotenv").config({debug: true}); 时,我遇到以下消息:"USER" is already defined in process.env and will not be overwritten

此外,当我尝试加载页面时,它遇到以下错误ER_dbaccess_DENIED_ERROR: Access denied for user ''@'localhost' to database '_api'

.env:

USER=root
PASS=

解决方法

来自Variables overwriting/priority

已经设置的环境变量不会被覆盖,这意味着命令行变量的优先级高于所有在 env 文件中定义的变量;

还有这个What happens to environment variables that were already set?

我们绝不会修改任何已经设置的环境变量。特别是,如果 .env 文件中有一个变量与环境中已经存在的变量发生冲突,那么该变量将被跳过。此行为允许您使用特定于机器的环境覆盖所有 .env 配置,但不建议这样做。

如果你想覆盖 process.env,你可以这样做:

const fs = require('fs')
const dotenv = require('dotenv')
const envConfig = dotenv.parse(fs.readFileSync('.env.override'))
for (const k in envConfig) {
  process.env[k] = envConfig[k]
}