2012-01-15 45 views
9

我正在使用Express,并且我需要为每个服务器(分段和生产)使用不同的凭据。Node.js:如何为prod和staging设置不同的变量

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

server.coffee: 

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

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

回答

1

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

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

1

我有一个应用程序,它根据环境(生产=环境变量; staging =命令行参数;本地=配置文件)使用三种声明配置变量(uris,api键,凭据等)的不同方法。 我写了一个小“配置”模块来处理合并所有的这些选择到一个对象,我可以在我的应用程序使用,并上传它作为一个要点:https://gist.github.com/1616583

它可能不是最好的实现,但它一直在努力到目前为止很好:)。

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 
} 
+0

我不明白的app.js代码。我在config.js中设置了变量,但是,如何在app.js中“读取”它们? – donald 2012-01-24 19:46:49

+1

./config.js中的最后一行允许您将该代码导出到./app.js文件。 ./config.js根据您的环境返回相应的json对象,然后将变量cfg设置为该json对象。但是有一个错误。 config.something应该是cfg。因为这是你正在创建的变量的名称。 – 2012-05-03 12:26:12

+0

确保在生产服务器上设置了'NODE_ENV'配置变量。用Heroku它会是'heroku config:set NODE_ENV = production'。如果不这样做,'config.js'的最后一行将不起作用。 – 2015-10-04 20:52:47

2

我已经上传的实现为https://github.com/qiangyu/nodejsconfig。我相信它会满足你的需求。基本上,你只需要提供一个配置文件:

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

然后,使用下面的代码读取appAddress在PROD环境:

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")); 
6

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

当运行脚本(见NPM-脚本(7))中的package.json“配置”键在环境中覆盖,如果有是<name>[@<version>]:<key>

一个配置PARAM我不会用他们每一个类型的变量配置设置的,但我认为这是简单的情况下,像URL和端口一个很好的解决方案,因为:

  1. 你把它们直接进入的package.json。
  2. 此外,您可以在命令行或ENV变量中指定它们。
  3. 通过npm运行的任何东西都可以指代它们(例如脚本)。
  4. 您可以将它们设置每个用户有`NPM配置集富:80端口

一个需要注意的是,在你的package.json的config参数仅自动导出到环境中,当你运行你的代码通过npm。所以,如果你只是用节点运行它,比如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,它会被“命名空间”作为process.env.npm__config_connector_port您运行npm的任何地方,包括您在客户端中运行的脚本,这些脚本取决于连接器,并且您始终可以在命令行,ENV或者.npmrc中覆盖它。你只需要记住,就像任何环境变量一样,它可能并不总是被设置的。所以,我会使用默认运算与process.env.npm_config_connector_port作为第一个(首选)值:

var port = process.env.npm_config_connector_port || sane_default

这里,sane_default可以从其他推荐的方法之一来填充。就个人而言,我喜欢保持像这样在JSON文件中的配置数据在最低限度,并且的package.json似乎是最好的JSON文件,把他们中的数据,而不是代码存储它们,然后你可以很容易地使用静态JSON在线,动态生成它们,或从文件系统,URL或数据库中提取它们。