我遇到了与本地NodeJS设置和环境变量以及部署到Heroku相同的问题。
我的解决方案是创建一个配置文件,可以处理这两种情况,并为我的项目提供整洁,自动化的方法。
我的NodeJS服务器是使用babel-node
运行的,因此我的配置文件是用ES6编写的,您可能需要根据自己的需求进行转换。
如果我们以一个例子.env文件为例:
NODE_ENV=development
API_ENDPOINT=http://localhost:7000
SOMETHING_ELSE=some-text
而我的 config.js
放在 NodeJS 应用的根目录下:
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文件作为固定变量提交到您的代码库中(您绝不能这样做),您可以在相同的配置文件中访问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仪表板中设置的变量。您可能决定要为env添加前缀并将process.env
循环过滤到你想要暴露给你的应用程序的变量。
如您在我新的配置文件中所看到的,如果DotEnv运行没有错误,那么我们可以假设存在一个.env文件并像以前一样使用它们并进行设置。
但是,如果出现错误,那么我们假设没有.env
文件,并回退到检查process.env
。然后,我们将envs
变量设置为对象envs = {};
,然后将找到的每个变量在process.env
中设置为键值对。 然后像往常一样导出envs
。
这可以使Heroku中的环境变量在应用程序中可用,而无需更改您的整个应用程序的逻辑。
希望这对于遇到相同问题的人有所帮助。
dotenv
,这应该是正确的答案。详细说明加1分。 - zerohedgeexport { envs };
而不是module.exports = envs;
。 - Succ