节点JS环境变量和Heroku部署

Ale*_*ard 3 heroku environment-variables node.js

我有一个使用dotenv包的项目将我的环境变量加载到我的NodeJS应用程序中,我使用以下行

var dotenv = require('dotenv').load({ silent: true }); 

//Example of use
username: process.env.CONVERSATION_USERNAME
Run Code Online (Sandbox Code Playgroud)

我现在计划在Heroku上部署此应用程序。但是,出于某些明显的安全原因,我不想提交.env文件。

我是NodeJS的新手,我想知道是否可以说“如果.env文件不存在,请从Heroku加载环境变量”

谢谢,Alexi

小智 10

我在本地 NodeJS 设置和环境变量以及部署到 Heroku 时遇到了同样的问题。

我的解决方案是创建一个配置文件来处理这两种情况,并在我的项目中为我提供一个整洁、自动化的方法。

我的 NodeJS 服务器使用 运行babel-node,所以我的配置文件是用 ES6 编写的,您可能需要根据自己的需要进行转换。

如果我们以 .env 文件为例:

NODE_ENV=development
API_ENDPOINT=http://localhost:7000
SOMETHING_ELSE=some-text
Run Code Online (Sandbox Code Playgroud)

config.js在 NodeJS 应用程序的根目录中:

import dotenv from 'dotenv';

const result = dotenv.config();
const envs = result.parsed;

module.exports = envs;
Run Code Online (Sandbox Code Playgroud)

您可以在我的代码中看到,我使用了 DotEnv 并创建了一个envs变量:let envs. 在本地,我使用 DotEnv 解析我的 .env 文件并将其作为对象传递给我的应用程序。

这意味着我可以.env轻松地从我的应用程序中导入我的变量:

import { NODE_ENV } from './config';
Run Code Online (Sandbox Code Playgroud)

赫鲁库

在 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;
Run Code Online (Sandbox Code Playgroud)

因为我的项目中已经有 lodash 可用,所以我用它来处理process.env变量的循环。

注意:这使您的 dyno 中的每个 env 变量都可用,而不仅仅是您在 Heroku 仪表板中设置的变量。您可能决定要为您的 env 加上前缀,并将process.env循环过滤为您想要向应用程序公开的变量。

正如您在我的新配置文件中看到的,如果 DotEnv 运行时没有错误,那么我们可以假设存在一个 .env 文件并使用该文件中的变量并像我们之前所做的那样设置它们。

但是,如果有错误,那么我们假设没有.env文件,并回退到检查process.env我们然后将envsvar 设置为一个对象envs = {};,然后将我们找到的每个变量设置process.env为一个键值对。然后envs正常导出。

这使得 Heroku 的 env 变量在您的应用程序中可用,而无需在整个应用程序中更改逻辑。

希望这可以帮助任何有同样问题的人。


Yon*_*tch 6

不要将.env提交给git(即,它应该在您的.gitignore中)。

您可以通过Heroku仪表板或heroku config:set在Heroku上定义env var,例如

heroku config:set CONVERSATION_USERNAME=Alex
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见此处