拥有分层node.js配置文件

时间:2016-01-14 19:16:25

标签: node.js config

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

  • 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

如此处所示,我有一个全局和模块特定的配置文件。我想将它们合并到一个配置文件中并使用这种方式。

有没有办法轻松实现这一目标? (就像预先编写的模块一样)或者我应该遍历每个属性并覆盖是否存在相同的密钥?

1 个答案:

答案 0 :(得分:0)

我写了一个位于https://github.com/quimsy/espresso下的模块,其中包含一个Config Tree Builder。它(部分)是Symfony的配置组件的端口。

您可以定义配置树:

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

使用处理器您可以合并多个符合这些规则的配置:

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

查看Defining and Processing Configuration Values,因为这个模块是90%兼容的 - 一些不同的命名约定并且考虑到数组/对象(在PHP中只有数组类型)。