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

时间:2013-07-11 00:03:54

标签: node.js heroku socket.io localhost environment-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来访问后端的那些变量,但我想知道是否有任何方法可以通过编程方式确定在我的前端脚本中使用哪些变量?我宁愿把脚本保留为静态除此之外,但也许这是不可能的?

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

4 个答案:

答案 0 :(得分: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: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;

答案 1 :(得分:2)

我刚刚在2.5年后发现了这个问题因为SO告诉我它达到了1k的观点。我认为我现在解决这个问题的方式就是说

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

然后只是根据我的其他变量。它实际上并没有给我环境变量,但它解决了我自己知道使用哪条路径的问题。 (在这种情况下,可能只是说io.connect('/')就足够了。)

答案 2 :(得分:1)

一种方法是使用conf.js文件和env.js文件,这些文件将取决于计算机。

.gitignore

import ENV from './env.js'
const conf = {
  "dev": {
     url: '/'
  },
  "prod": {
     url: 'www.example.com'
  },
  "test": {
     url: 'www.example-test.com'
  }
}
export default conf[ENV]

conf.js

// dev
export default "dev"

env.js

// prod
export default "prod"

env.js

import conf from './conf'
console.log("my env url is ", conf.url)

就是这样。 现在您可以在任何需要的地方使用它。

index.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;
        `
    );
});

}

您还可以使用grunt.js使一切变得更加自动化

Gruntfile.js

{
  ...
  "scripts": {
     "build": "node scripts/build.js",
     "buildProd": "npm run grunt env:prod && npm run build",
      "buildTest": "npm run grunt env:test && npm run build"
  }
  ...
}

现在您必须在package.json中更改脚本

npm run buildProd

然后在命令行上运行

YourTextfieldName.layer.cornerRadius = YourTextfieldName.frame.size.height/2
YourTextfieldName.clipsToBounds = true

答案 3 :(得分:0)

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

如上所述,如果您愿意,您可以随时使用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)。