我在本地 NodeJS 设置和环境变量以及部署到 Heroku 时遇到了同样的问题。
我的解决方案是创建一个可以处理这两种情况的配置文件,并在我的项目中为我提供一个整洁、自动化的方法。
我的 NodeJS 服务器使用babel-node 运行,所以我的配置文件是用 ES6 编写的,您可能需要根据自己的需要进行转换。
如果我们以 .env 文件为例:
NODE_ENV=development
API_ENDPOINT=http://localhost:7000
SOMETHING_ELSE=some-text
还有我在 NodeJS 应用程序根目录中的 config.js:
import dotenv from 'dotenv';
const result = dotenv.config();
const envs = result.parsed;
module.exports = envs;
您可以在我的代码中看到,我使用 DotEnv 并创建了一个 envs 变量:let envs。在本地,我使用 DotEnv 解析我的 .env 文件并将其作为对象传递给我的应用程序。
这意味着我可以在我的应用中轻松地从我的.env 导入我的变量:
import { NODE_ENV } from './config';
Heroku
在 Heroku 中,您可以在 Heroku 仪表板中项目的设置页面中设置环境变量。因此,为避免将 .env 作为 repo 中的固定变量提交(您永远不应该这样做),您可以在同一配置文件中访问 process.env 全局变量。
所以你的config.js 文件变成:
import dotenv from 'dotenv';
import _ from 'lodash';
const result = dotenv.config();
let envs;
if (!('error' in result)) {
envs = result.parsed;
} else {
envs = {};
_.each(process.env, (value, key) => envs[key] = value);
}
module.exports = envs;
由于我的项目中已经有 lodash,因此我使用它来处理循环通过 process.env 变量。
注意:这使您的 dyno 中的每个 env 变量都可用,而不仅仅是您在 Heroku 仪表板中设置的变量。您可能决定要为您的环境添加前缀并将process.env 循环过滤为您想要公开给您的应用程序的变量。
正如您在我的新配置文件中看到的那样,如果 DotEnv 运行时没有错误,那么我们可以假设存在 .env 文件并使用其中的 var 并像以前一样设置它们。
但是,如果有错误,那么我们就假设没有.env 文件,然后回退到检查process.env 然后我们将envs var 设置为一个对象envs = {};,然后将我们在process.env 中找到的每个变量设置为键值对。然后正常导出envs。
这使得 Heroku 的环境变量可以在您的应用程序中使用,而无需在整个应用程序中更改您的逻辑。
希望这对遇到同样问题的人有所帮助。