NodeJS:在前端脚本中使用环境variables

我正在编写一个socket.io应用程序,而且每次我推送到heroku时,都不得不在我的前端scripts.js文件中排队。

var socket = io.connect('http://localhost'); 

 var socket = io.connect('http://ersatz-elephant-1337.herokuapp.com/'); 

我知道我可以使用process.env.VAR在后端访问这些variables,但我想知道是否有任何方式来编程决定哪些使用我的前端脚本? 我宁愿把脚本放在静态的地方,但也许这是不可能的?

编辑:我不是真的在后端寻找解决scheme…我正在寻找一种方式,我的/public/scripts.js文件可以连接到正确的事情。 我想可能唯一的方法是通过在server.js为前端脚本文件指定一些特殊的东西,而不是静态地提供它,但如果是这样,那么这就是我正在寻找的指令,而不是如何实际访问env vars在服务器上。 对不起,有什么困惑!

这很可能。 无论是使用工头还是使用像这样的configuration脚本:

 var url = require('url'); var config = {}; var dbUrl; if (typeof(process.env.DATABASE_URL) !== 'undefined') { dbUrl = url.parse(process.env.DATABASE_URL); } else { dbUrl = url.parse('tcp://postgres:postgres@127.0.0.1:5432/db'); } config.dialect = 'postgres'; config.protocol = dbUrl.protocol.substr(0, dbUrl.protocol.length - 1); // Remove trailing ':' config.username = dbUrl.auth.split(':')[0]; config.password = dbUrl.auth.split(':')[1]; config.host = dbUrl.hostname; config.port = dbUrl.port; config.database = dbUrl.path.substring(1); console.log('Using database ' + config.database); module.exports = config; 

我刚刚在2.5年后发现了这个问题,因为我告诉我这个问题碰到了1K的意见。 我想现在解决这个问题的方式就是说

 var isLocal = ~location.href.indexOf('://localhost'); 

然后基于我的其他variables。 它实际上并没有给我提供环境variables,但它解决了我自己知道要使用哪个path的问题。 (在这种情况下,可能只是说io.connect('/')就足够了。)

我知道你问了一个使用环境variables的解决scheme,但是我的观点是使用运行时参数是一个更好的解决scheme,因为它提供了更好的灵活性。

正如我上面所说的,如果你愿意的话,你可以总是使用一个shell脚本(适合于你使用的操作系统)来设置基于环境variables的运行时参数。

要使用参数,可以使用process.argv 。 你可以对此做一个forEach并遍历参数(参考node.js手册进程argv )。 我个人会使用一个模块。 我喜欢的那个叫做opt 。 它有很多不错的function,使得处理命令行参数非常简单。 您可以指定默认值,为每个参数定义帮助消息等。它甚至支持configuration文件。 我想你可能会发现这个吸引力。

但是,如果你喜欢KISS的方法,那么我会build议使用process.argv

如果您在脚本中使用了环境variables,那么您始终可以使用process.env.MY_ENV_VARIABLE ,其中MY_ENV_VARIABLE是环境variables(请参阅如何读取节点js中的环境variables )。