有分层的node.jsconfiguration文件

我来之前先在这里查过 我的问题与此有点不同。 我有以下文件夹结构。

  • app.js
  • global.config.js
  • 节点模块
    • 我的模块
      • module.config.js
      • index.js

global.config.js:

var config = {}; config.loggingLevel: "error"; // global setting for all custom modules 

module.config.js:

 var config = {}; config.loggingLevel: "info"; // ideally should override global setting 

index.js

 var globalDir = path.dirname(require.main.filename) + "\\global.config.js"; var globalConfig = require(globalDir); var moduleConfig = require("./module.config.js"); // merge configs here and use only one config object 

如在这里看到的,我有一个全局和模块特定的configuration文件。 我想将它们合并成一个configuration文件,并以这种方式使用。

有什么办法可以轻松实现吗? (就像一个预先编写的模块)或者我应该迭代通过每个属性和重写,如果相同的密钥存在?

我写了一个位于https://github.com/quimsy/espresso的模块,其中包含一个configuration树生成器。 它(部分)是Symfony的configuration组件的一个端口。

您可以定义一个configuration树:

 var TreeBuilder = require("Espresso/Config/Definition/Builder/TreeBuilder"); var builder = new TreeBuilder(); var root = builder.root("connection"); root .children() .scalarNode("host").defaultValue("localhost").end() .end(); 

和处理器你可以合并多个configuration尊重这些规则:

 var Processor = require("Espresso/Config/Definition/Processor"); var processor = new Processor(); var mergedConfiguration = processor.process( root.getNode(), [ config1, config2 ] ); 

关于上面的例子,你会做这样的事情:

 var builder = new (require("Espresso/Config/Definition/Builder/TreeBuilder")(); var root = builder.root("myConfigRoot"); /* some definitions */ var processor = new (require("Espresso/Config/Definition/Processor"))(); var config = processor.process( root.getNode(), [ globalConfig, moduleConfig ] ); 

看看定义和处理configuration值 ,因为这个模块是90%兼容的 – 一些不同的命名约定,并考虑到arrays/对象(在PHP中只有数组types)。