1

我正在使用nconf为我的 node.js Express Web 服务器调用的环境变量和参数解析模块。

https://github.com/indexzero/nconf

我决定使 nconf 数据全局化的最佳方法是将其简单地附加到进程变量(如在 process.env 中),这是一个好主意还是坏主意?它会减慢“过程”的执行速度吗?

这是我的代码:

var nconf = require('nconf');

nconf.argv()
    .env()
    .file({ file: './config/config.json' });

nconf.defaults({
    'http': {
        'port': 3000
    }
});

process.nconf = nconf;

//now I can retrieve config settings anywhere like so process.nconf.get('key');

坦率地说,我有点喜欢这个解决方案。现在我可以在任何地方检索配置数据,而无需模块。但这可能有缺点……而且很可能是一个非常糟糕的主意。身份证。

4

2 回答 2

3

它不会减慢执行速度,但感觉“臭”。很难发现,也很难测试,如果你决定需要的话。

更好的解决方案是将设置附加到模块并使用 require() 在需要的地方导入它。

最好的解决方案是将您的设置对象传递给需要它的类或模块。要么直接,要么作为某种“全球背景”的一部分。

例如。

var global = {
  settings: {
    port: 8080
  }
}

//...

global.api = new Api(global);

//...

function Api(global) {
  var port = global.settings.port;
}

更新:有关原始模式为何不好的更多信息:

1) 可发现性

您将设置附加到process.settings并转到另一个项目。一年后,别人接手,或者你需要更新东西。你会记得你附加了你的设置process.nconf吗?或者是process.settings吗?

现在想象一下,你有 10 个不同的全局事物,以不同的名称连接在不同的地方。

它并不像直接附加到全局上下文那么糟糕,但最好清楚地看到你正在使用的东西来自哪里(构造函数或模块)。

2) 测试

您决定需要测试您的模块。因此,现在您需要调整每个测试的设置,而不是从文件或 argv 加载它们。你是怎样做的?

如果是全局process.nconfrequire("settings")模式,您需要执行以下操作:

function canOpenAPIOnTheConfiguredPort(done) {
    var nconfSaveApiPort = process.nconf.api.port;
    process.nconf.api.port = '1234';
    var api = new Api();
    test.assertEqual(api.port, '1234');
    process.nconf.api.port = nconfSaveApiPort;
    done();
}

随着您的应用程序的增长,这很快就会变得烦人(例如,想象必须模拟 10 件事情)。相比之下,这是使用依赖注入(构造函数)模式的方法。

function canOpenAPIOnTheConfiguredPort(done) {
    var api = new Api({
        port: '1234'
    });
    test.assertEqual(api.port, '1234');
    done();
}
于 2015-04-19T18:56:23.207 回答
1

请注意,nconf 是一个单例。

我习惯在程序一开始就进行配置,然后当我需要在另一个文件中进行设置时,我会这样做:

var nconf = require ('nconf');
nconf.get('x');
于 2015-04-20T02:39:24.953 回答