我正在写一个socket.io应用程序,每次我推送到heroku时,我都不得不在我的前端scripts.js文件中输入一行,
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 vars在服务器上。对不起任何混乱!
这很有可能。要么使用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;
我刚刚在2.5年后发现了这个问题因为SO告诉我它达到了1k的观点。我认为我现在解决这个问题的方式就是说
var isLocal = ~location.href.indexOf('://localhost');
然后只是将我的其他变量基于此。它实际上并没有给我环境变量,但它解决了我自己知道使用哪条路径的问题。 (在这种情况下,可能只是说io.connect('/')
就足够了。)
一种方法是使用conf.js文件和依赖于机器的env.js文件。
的.gitignore
# it depends on the environement
env.js
conf.js
import ENV from './env.js'
const conf = {
"dev": {
url: '/'
},
"prod": {
url: 'www.example.com'
},
"test": {
url: 'www.example-test.com'
}
}
export default conf[ENV]
env.js
// dev
export default "dev"
env.js
// prod
export default "prod"
而已。现在你可以在任何你想要的地方使用它。
index.js
import conf from './conf'
console.log("my env url is ", conf.url)
你也可以使用grunt.js让一切更自动化
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({});
grunt.registerTask("env", function(envValue = 'dev') {
grunt.file.write(
"env.js",
`/* AUTO GENERATED FILE FROM GRUNT */\n
export default envValue;
`
);
});
}
现在你必须在package.json中更改你的脚本
{
...
"scripts": {
"build": "node scripts/build.js",
"buildProd": "npm run grunt env:prod && npm run build",
"buildTest": "npm run grunt env:test && npm run build"
}
...
}
然后在命令行上运行
npm run buildProd
我知道您要求使用环境变量的解决方案,但我的观点是使用运行时参数是一个更好的解决方案,因为它提供了更好的灵活性。
如上所述,您可以随时使用shell脚本(适用于您使用的操作系统)根据环境变量设置运行时参数(如果您愿意)。
要使用args,请使用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)。