2013-07-11 28 views
1

我正在写一个socket.io应用程序,我在不必机会一行在我的前端scripts.js中越来越恼火文件每次我推到Heroku的时间,从的NodeJS:在前端脚本中使用环境变量

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

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

我知道我可以使用process.env.VAR来访问后端的变量,但我不知道是否有任何办法以编程方式确定这在我的前端脚本中使用?我宁愿把脚本留在静态的地方,但也许这不可能?

编辑:我不是真的在后端寻找解决方案...我正在寻找一种方式,我的/public/scripts.js文件可以连接到正确的东西。我想也许这样做是通过指定server.js一些特别针对前端脚本文件,而不是静态地服务于它的唯一途径,但如果是这样,那么这就是我要找的,而不是如何实际访问ENV瓦尔指令在服务器上。对不起,有任何困惑!

+0

从您的问题中可以看出,在执行或预执行期间何时确定要推送到哪个目标并不明确。你决定在剧本运行的哪个路径上,或者你知道之前知道吗? – Metalskin

+0

ummm,预执行。就像它是一个静态文件一样,它只是需要在heroku上与本地不同。 – MalcolmOcean

+1

我个人建议在这种情况下使用运行时参数。我不喜欢使用环境变量,它总是变得混乱。如果您使用运行时参数,那么您可以随时使用shell脚本来根据需要使用环境变量。尽管如此,这更多的是个人品味。 – Metalskin

回答

2

这是很有可能的。无论是使用foreman或使用配置脚本像这样的:

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:[email protected]: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; 
+0

但process.env.DATABASE_URL在哪里设置? –

+0

使用领班在开发中以及通过生产和CI主机上的其他方式设置'DATABASE_URL'。例如,请参阅https://devcenter.heroku.com/articles/config-vars – dankohn

0

我知道你要的使用环境变量的解决方案,但我的观点是,使用运行参数是一个更好的解决方案,因为它提供了更好的灵活性。

正如我上面所说,你就可以随时使用shell脚本(按照适合您使用的操作系统)来设置基于环境变量,如果你愿意的运行PARAMS。

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

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

如果您在脚本中使用环境变量,那么您始终可以使用process.env.MY_ENV_VARIABLE,其中MY_ENV_VARIABLE是环境变量(请参阅how to read environment variable in node js)。

1

我刚刚在2.5年后发现这个问题,因为SO告诉我它击中了1k个观点。我想我现在可以解决这个问题的方式就是说类似于

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

然后再基于我的其他变量。它实际上并不给我环境变量,但它解决了我所遇到的问题,即自动知道使用哪条路径。 (在这种情况下,可能只是说io.connect('/')已经足够了。)