2

我正在编写一个 socket.io 应用程序,每次我从

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

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

我知道我可以process.env.VAR用来访问后端的这些变量,但我想知道是否有任何方法可以以编程方式确定在我的前端脚本中使用哪个?除此之外,我宁愿将脚本保留为静态,但也许这是不可能的?

编辑:我并不是真的在后端寻找解决方案......我正在寻找一种我的/public/scripts.js文件可以连接到正确事物的方式。我想也许唯一的方法是server.js为前端脚本文件指定一些特殊的东西,而不是静态地提供它,但如果是这样,那么这就是我正在寻找的指令,而不是如何实际访问环境变量服务器。很抱歉有任何混淆!

4

4 回答 4

2

这是很有可能的。要么使用工头,要么使用像这样的配置脚本:

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;
于 2013-07-11T00:56:07.060 回答
2

2.5 年后我才发现这个问题,因为 SO 告诉我它的浏览量达到了 1k。我想我现在解决这个问题的方法是说类似

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

然后以我的其他变量为基础。它实际上并没有给我环境变量,但它解决了我遇到的问题,即自动知道要使用哪个路径。(在这种情况下,可能只是说io.connect('/')就足够了。)

于 2015-11-20T09:09:45.383 回答
2

一种方法是使用依赖于机器的 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]

环境.js

// dev
export default "dev"

环境.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
于 2018-07-11T08:31:09.707 回答
0

我知道您要求使用环境变量的解决方案,但是我认为使用运行时参数是更好的解决方案,因为它提供了更好的灵活性。

如上所述,如果您愿意,您可以随时使用 shell 脚本(根据您使用的操作系统)根据环境变量设置运行时参数。

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

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

如果您准备在脚本中使用环境变量,那么您始终可以使用process.env.MY_ENV_VARIABLEwhere MY_ENV_VARIABLEis the environment variable(请参阅如何在 node js 中读取环境变量)。

于 2013-07-15T22:23:25.983 回答