Node JS环境变量和Heroku部署

12

我有一个项目,使用dotenv包在我的NodeJS应用程序中加载环境变量。

我使用以下行:

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

//Example of use
username: process.env.CONVERSATION_USERNAME

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

我是NodeJS的新手,想知道是否有一种方法来说“如果.env文件不存在,则从Heroku加载环境变量”

谢谢,Alexi

4个回答

16

我遇到了与本地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中的环境变量在应用程序中可用,而无需更改您的整个应用程序的逻辑。

希望这对于遇到相同问题的人有所帮助。


1
如果使用 dotenv,这应该是正确的答案。详细说明加1分。 - zerohedge
1
如果使用ES6,您可能需要使用export { envs };而不是module.exports = envs; - Succ

13
不要将您的 .env 提交到 git 中(即应在您的 .gitignore 中)。您可以通过 Heroku 仪表板或 heroku config:set 命令定义环境变量,例如:
heroku config:set CONVERSATION_USERNAME=Alex

请参见此处以获取更多信息。


3
今天我遇到了这个问题,尝试了几种解决方案,但都没有成功。我的应用程序在本地工作正常,但在生产模式(heroku)中无法正确加载 process.env。
然后我发现了这个https://www.npmjs.com/package/dotenv-webpack
plugins: [
    new Dotenv({ systemvars: true }),
],

只需将systemvars设置为true即可解决问题。目前,我已经使用不同的密钥测试了.env文件和heroku仪表板;它们没有连接,在生产或开发模式下正确替换自己。
请使用“dotenv-webpack”包,而不是“dotenv”。
我希望这能为面对相同问题的任何人节省一些时间。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接