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

我正在使用Express,我需要为每台服务器使用不同的凭据(分段和生产)。

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

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

有什么解决scheme? 设置variables,然后导出它们?

./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 } 

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

当运行脚本时(参见npm-scripts(7)),如果有<name>[@<version>]:<key>的configuration参数,package.json“config”键将在环境中被覆盖<name>[@<version>]:<key>

我不会为每种types的variablesconfiguration设置使用它们,但是我认为这对于URL和端口等简单情况是一个很好的解决scheme,因为:

  1. 你把它们直接放到package.json中。
  2. 另外,您可以在命令行或ENVvariables中指定它们。
  3. 任何通过npm运行的东西都可以引用它们(例如脚本)。
  4. 你可以用`npm config set foo:port 80'设置每个用户

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

因为它可能不会立即显而易见,我还要补充一点, npm_package_config环境variables不会冒泡到依赖于您的npm包的应用程序。 所以,如果你的依赖包引用了process.env.npm_package_config_foo ,那么依赖包就必须在它自己的package.json中定义它。 我想因为它是一个“npm_package_config”,把它们一直推到树上是没有意义的。

那么,我将如何使用一个npmconfigurationvariables,并使它在树的基础包和依赖它的包中一直工作? 这实际上有点混乱,我必须通过反复试验来弄清楚。

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

但是,如果使用process.env.npm_config_connector_port (注意第一个以npm_package_config开始,另一个以npm_config_packagename开头 ),那么您至less可以在.npmrc中使用npm config set connector:port 80 ,它将会是“命名空间“作为process.env.npm__config_connector_port运行npm,包括在客户端运行的依赖于连接器的脚本,并且始终可以在命令行,ENV或者.npmrc中覆盖它。 你只需要记住,就像任何环境variables一样,它可能并不总是被设置的。 所以,我将使用process.env.npm_config_connector_port作为第一个(首选)值的默认运算符:

var port = process.env.npm_config_connector_port || sane_default

在这里, sane_default可以从其他推荐的方法之一填充。 就我个人而言,我喜欢至less在JSON文件中保存像这样的configuration数据,而package.json似乎是最好的JSON文件,将它们存储在数据而不是代码中,然后您可以轻松地使用静态JSON in-行,dynamic生成它们,或从文件系统,URL或数据库中提取它们。

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

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

如果你不想确定在每个文件中使用哪个configuration的逻辑(这看起来相当丑陋),你必须将它导出到某个地方。

我会build议:有一个config.json文件包含不同的configuration。 主文件需要它,并执行像config.default = config.(condition ? 'production':'development') 。 在所有其他文件中,您现在可以只require('./config').default

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

它可能不是最好的实现,但到目前为止工作得很好:)。