Node.js全局配置

9
我正在进行一个小型控制台项目,该项目在很大程度上依赖于最初传递的参数,并且我正在寻找一种在nodejs中处理配置对象的好方法。
目前,我已经使用以下示例完全实现了该项目,但我认为在使用'require'时依赖模块的缓存。
让我们假设一个名为options.js的模块。
'use strict';

var options = {
    configName: '.jstail',
    colorActive: (process.platform === 'win32') ? false : true, // deactivate color by default on windows platform
    quiet: false,
    debug: false,
    config: null,
    logFile: null,
    setting: null
};

module.exports = options;

我的初始模块 init.js

#!/usr/bin/env node
'use strict';

var options = require('options'); // require above options module

// modify the options object based on args

接下来我有一个依赖于这些选项的日志记录器

例如,如果将quiet设置为true,则不应发生任何日志记录

logger.js

'use strict';

var options = require('options');

/**
 * prints to console if not explicitly suppresed
 * @param {String} text
 */
function log(text) {
   if (!options.quiet) {
       console.log('[LOG]: ' + text);
   }
}

我的主要问题(我认为)是我在日志程序中调用选项模块时,依赖于Node.js模块的缓存机制。

所以,我的两个问题是:

我是否正确地理解了这只有通过Node.js对模块的缓存才能正常工作? 有没有更好的方法来处理动态全局配置?

我知道有一些关于配置文件的问题和教程,但这不是我要找的。

1个回答

10

是的,这只能在缓存的情况下工作,虽然我不会称其为缓存(但node.js文档确实如此),而更多地是懒惰初始化。依赖它没问题,许多模块会在第一次require时进行一些初始化,将其用于配置也很典型。一般来说,require是访问全局单例对象的node.js方式。

另一种方法是从单个文件中加载配置,修改它,然后传递给其他需要它的模块,像这样:

//index.js
var config = require('./config')

config.flag = false

var module1 = require('./module1')(config)

//module1.js
module.exports = function (config) {
// do stuff
}

它使代码更加解耦和可测试,但增加了复杂性。这两种方法的区别基本上与使用全局变量与依赖注入相同。使用您喜欢的任何一种方法。


谢谢您的快速回答。我没有意识到我可以通过这种方式将配置传递给模块。当我在nodeunit中编写测试时,我对全局配置的依赖是我的主要关注点。由于“缓存”的原因,当启动新的测试时,配置没有被重置为其初始状态。因此,我必须手动确保在每个测试之后将配置对象重置为其初始状态。您的答案真的帮了我很多,我想我会继续使用全局配置。 - Playerwtf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接