Node.js:如何为prod和staging设置不同的变量

时间:2012-01-15 02:11:39

标签: javascript node.js coffeescript express

我正在使用Express,我需要为每个服务器使用不同的凭据(登台和制作)。

我可以在server.coffee文件中设置变量,但之后我需要在不同的文件中访问这些变量。

server.coffee:

app.configure 'production', () ->
 app.use express.errorHandler()

解决方案是什么?设置变量然后导出它们?

5 个答案:

答案 0 :(得分:19)

<强> ./ config.js

var development = {
  appAddress : '127.0.0.1:3000',
  socketPort : 4000,
  socketHost : '127.0.0.1',
  env : global.process.env.NODE_ENV || 'development'
};

var production = {
  appAddress : 'someDomain.com',
  socketPort : 4000,
  socketHost : '8.8.8.8',
  env : global.process.env.NODE_ENV || 'production'
};

exports.Config = global.process.env.NODE_ENV === 'production' ? production : development;

<强> ./ app.js

var cfg = require('./config').Config;

if (cfg.something) { // switch on environment
  // your logic
}

答案 1 :(得分:6)

这可能是使用npm-config的好地方。

  

当运行脚本时(参见npm-scripts(7)),如果有<name>[@<version>]:<key>

的配置参数,则会在环境中覆盖package.json“config”键

我不会将它们用于每种类型的变量配置设置,但我认为这对于URL和端口等简单案例来说是一个很好的解决方案,因为:

  1. 您将它们直接放入package.json。
  2. 此外,您可以在命令行或ENV变量中指定它们。
  3. 任何通过npm运行的东西都可以引用它们(例如,脚本)。
  4. 您可以使用`npm config set foo:port 80
  5. 为每个用户设置它们

    需要注意的是,当您通过npm运行代码时,package.json中的config参数仅会自动导出到环境中。因此,如果您只是使用节点运行它,例如node ./myapp.js,那么您不能指望process.env.npm_package_config_foo将包含您的值。但是,您始终可以var pkg = require('./package.json');访问pkg.config上的值。

    因为它可能不是很明显,我还要补充一点,npm_package_config环境变量不会冒泡到依赖于你的npm包的应用程序。因此,如果您的依赖包引用process.env.npm_package_config_foo,则依赖包必须在其自己的package.json中定义它。我想因为它是一个“npm_package_config”将它们一直推到树上是没有意义的。

    那么,我如何使用一个npm配置变量并让它在基础包和依赖它的包中一直向上运行?这实际上有点令人困惑,我不得不通过反复试验来解决这个问题。

    假设您有一个包连接器和包客户端客户端依赖于连接器,并且您希望为连接器指定可在客户端中使用或覆盖的配置参数。如果您在连接器模块中使用process.env.npm_package_config.port,那么当它依赖于客户端模块时,该变量将不会被导出,最终将变为未定义。

    但是,如果您改为使用process.env.npm_config_connector_port(注意第一个以 npm_package_config 开头而另一个以 npm_config_packagename 开头),那么您至少可以设置在你的.npmrc中使用npm config set connector:port 80,它将被命名为“{name}”到你运行npm的所有地方,包括你在依赖于连接器的 client 中运行的脚本,您将始终能够在命令行,ENV或.npmrc中覆盖它。您必须记住,与任何环境变量一样,它可能并不总是被设置。所以,我会使用默认运算符process.env.npm__config_connector_port作为第一个(首选)值:

    process.env.npm_config_connector_port

    此处, sane_default 可以从其他推荐方法中填充。就个人而言,我喜欢至少在JSON文件中保存这些配置数据, package.json 似乎是最好的JSON文件。将它们存储在数据而不是代码中然后就可以了轻松地在线使用静态JSON,动态生成它们,或从文件系统,URL或数据库中提取它们。

答案 2 :(得分:2)

我已将实施内容上传到https://github.com/qiangyu/nodejsconfig。我相信它会满足您的需求。基本上,您只需要提供一个配置文件:

dev.appAddress = '127.0.0.1:3000';
prod.appAddress = 'someDomain.com';

然后,您使用以下代码来读取prod环境中的appAddress:

var xnconfig = require('nodejsconfig');
var fs = require('fs');

var data = fs.readFileSync(__dirname+"/config.properties", "UTF8");

// assume we will be using environment "prod"
var config = xnconfig.parse("prod", data);

// the output will be someDomain.com
console.log(config.getConfig("appAddress"));

答案 3 :(得分:1)

如果您不想使用逻辑来确定在每个文件中使用哪个配置(这看起来很丑陋),您将不得不将其导出到某处。

我建议:拥有包含不同配置的config.json文件。主文件需要它并执行config.default = config.(condition ? 'production':'development')之类的操作。在所有其他文件中,您现在可以执行require('./config').default

答案 4 :(得分:1)

我有一个应用程序,它使用三种不同的方法来声明配置变量(uris,api密钥,凭证等),具体取决于环境(生产=环境变量; staging =命令行args; local = config文件。) 我写了一个小“配置”模块来处理将所有这些选项合并到一个对象中,我可以在我的应用程序中使用它并将其作为要点上传:https://gist.github.com/1616583

它可能不是最好的实现,但到目前为止它一直运行良好:)。