节点JS环境变量和Heroku部署

时间:2017-02-08 09:54:29

标签: node.js heroku environment-variables

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

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

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

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

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

谢谢, 奕利

4 个答案:

答案 0 :(得分:4)

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

您可以通过Heroku仪表板或Heroku配置在Heroku上定义env变量:set,例如。

heroku config:set CONVERSATION_USERNAME=Alex

有关详细信息,请参阅here

答案 1 :(得分:0)

我在本地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仪表板中设置的变量。您可能会决定要为环境添加前缀,并将process.env循环过滤为仅要向应用程序公开的var。

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

但是,如果出现错误,则我们假设没有.env文件,然后退回到检查process.env,然后设置{{ 1}} var作为对象envs,然后将在envs = {};中找到的每个变量设置为键值对。然后照常导出process.env

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

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

答案 2 :(得分:0)

我刚刚发现了这个,对我来说真的很好用。一个CLI界面,用于将.env变量移入或移出Heroku。

https://github.com/escaladesports/heroku-dotenv

答案 3 :(得分:0)

今天我偶然发现了这个问题,我尝试了几种解决方案,但都没有奏效。我的应用程序在本地运行,但在生产模式 (heroku) 下它没有正确加载 process.env。

然后我发现了这个https://www.npmjs.com/package/dotenv-webpack

plugins: [
    new Dotenv({ systemvars: true }),
],

只需将 systemvars 设置为 true 即可。 现在我已经使用不同的密钥对 .env 文件和 heroku 仪表板进行了测试;它们没有连接,它们在生产或开发模式下正确地替换了自己。

使用包“dotenv-webpack”而不是“dotenv”。

我希望这能为遇到同样问题的人节省一些时间