在Heroku中设置默认环境变量

时间:2015-06-03 21:14:08

标签: javascript node.js heroku environment-variables

我正在开发一个应用程序,该应用程序连接到需要使用APP ID和SECRET KEY的第三方API。

我将这些值存储为heroku中的环境变量,因此我不需要在代码中公开它们。

如果我部署到heroku,它将使用heroku的环境变量来解析这些API凭据。

如果我在本地工作,我想使用我的config.js模块,并在那里查找API凭据。注意:此config.js文件包含在我的.gitignore中,因此这些凭据永远不会在云中结束。

有问题的代码是:

var api_secret = process.env.API_SECRET || require('../../config.js').secret;

当我在本地运行时,我没有遇到任何问题。意思是,它无法解析环境变量,因此它使用secret内的config.js

当我在heroku上运行时,它会抛出错误告诉我module 'config.js' could not be found。这是有道理的,因为它永远不会被其余的回购推高,因为它在我的.gitignore中。

因为heroku在运行之前通过我的代码进行解析,所以require('../../config.js')是有问题的。它正在尝试查找不存在的文件。

如何解决部署时使用环境变量的问题,以及本地运行时config.js模块的问题?

2 个答案:

答案 0 :(得分:0)

在应用程序的Heroku仪表板上,您可以设置配置变量。如果您在机器上设置了Heroku Toolbelt,您也可以使用:

heroku config:set API_SECRET=secret

有关详情,请参阅this article

编辑:想想我可能误解了这个问题。如果可能,我建议使用dotenv npm package在本地设置配置变量。

如果没有,另外要检查的是config.js包在package.json文件中,因为Heroku将使用它来构建您的依赖项。

答案 1 :(得分:0)

如果你不想将你的config.js推到最后,你可以按照以下内容来确定配置文件是否存在,使用try catch和文件系统模块:

Check synchronously if file/directory exists in Node.js

在你的情况下:

var fs = require('fs'),
    api_secret,
    config;

try {
    // Check whether config.js exists
    config = fs.lstatSync('../../config.js');
    // If we reach this line then config.js exists, yay!
    api_secret = process.env.API_SECRET || require('../../config.js').secret;
    // or alternatively  api_secret = require('../../config.js').secret; 
    // depending on your logic

}
catch (e) {
    // else config.js does not exist
    api_secret = process.env.API_SECRET
}

要以编程方式运行Heroku命令,您可以设置一个免费的Ruby应用程序,并使其通过API调用执行您想要的操作。使用Heroku-api。见https://github.com/heroku/heroku.rb

如果你想手动设置Heroku命令,你可以使用命令heroku config:set MYVAR=MYVALUE或通过Heroku仪表板(点击你的应用程序>设置>显示配置变量>编辑)在Heroku上设置env变量