具有分层Node.js配置文件



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

  • 应用.js
  • global.config.js
  • 节点模块
    • 我的模块
      • 模块配置.js
      • 索引.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

索引.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

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

有什么方法可以轻松实现这一目标吗?(就像一个预先编写的模块)还是我应该循环访问每个属性并覆盖是否存在相同的键?

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

您可以定义配置树:

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

查看定义和处理配置值,因为此模块 90% 兼容 - 一些不同的命名约定并考虑数组/对象(在 PHP 中只有数组类型)。

最新更新