我有一个项目使用dotenv包在我的NodeJS应用程序中加载我的环境变量 我使用以下行
var dotenv = require('dotenv').load({ silent: true });
//Example of use
username: process.env.CONVERSATION_USERNAME
我现在计划在Heroku上部署此应用程序。但是,出于某些明显的安全原因,我不想提交我的.env文件。
我是NodeJS的新手,我想知道是否有办法说“如果.env文件不存在,请从Heroku加载环境变量”
谢谢, 奕利
答案 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仪表板中项目的设置页面中设置环境变量。因此,为避免在存储库中将.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。
答案 3 :(得分:0)
今天我偶然发现了这个问题,我尝试了几种解决方案,但都没有奏效。我的应用程序在本地运行,但在生产模式 (heroku) 下它没有正确加载 process.env。
然后我发现了这个https://www.npmjs.com/package/dotenv-webpack
plugins: [
new Dotenv({ systemvars: true }),
],
只需将 systemvars 设置为 true 即可。 现在我已经使用不同的密钥对 .env 文件和 heroku 仪表板进行了测试;它们没有连接,它们在生产或开发模式下正确地替换了自己。
使用包“dotenv-webpack”而不是“dotenv”。
我希望这能为遇到同样问题的人节省一些时间