将对象附加到Node.js进程

将对象附加到Node.js进程,node.js,express,nconf,Node.js,Express,Nconf,我正在为node.js Express web服务器使用名为nconf的环境变量和参数解析模块 我认为使NCOF数据全局化的最佳方法是将其附加到流程变量(如process.env),这是一个好主意还是一个坏主意?它会在降低“过程”的过程中减慢执行速度吗 这是我的密码: var nconf = require('nconf'); nconf.argv() .env() .file({ file: './config/config.json' }); nconf.default

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

我认为使NCOF数据全局化的最佳方法是将其附加到流程变量(如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');

坦率地说,我有点喜欢这个解决方案。现在我可以在任何地方检索配置数据,而不需要模块。但这可能有负面影响……而且这可能是一个非常糟糕的主意。IDK.

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

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

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

例如

更新:有关原始图案损坏原因的更多信息:

1) 可发现性

您可以将设置附加到process.settings,然后转到其他项目。一年后,其他人接手,或者你需要更新东西。您是否记得将设置附加到
进程.nconf
?或者是
过程设置

现在想象你有10种不同的全球事物,它们以不同的名称附着在不同的地方

它并没有直接连接到全局上下文那么糟糕,但是清楚地看到您使用的东西来自哪里(构造函数或模块)当然更好

2) 测试

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

对于全局
进程.ncof
要求(“设置”)
模式,您需要执行以下操作:

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件事情)。相比之下,这里介绍了如何使用依赖项注入(构造函数)模式


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

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

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

例如

更新:有关原始图案损坏原因的更多信息:

1) 可发现性

您可以将设置附加到process.settings,然后转到其他项目。一年后,其他人接手,或者你需要更新东西。您是否记得将设置附加到
进程.nconf
?或者是
过程设置

现在想象你有10种不同的全球事物,它们以不同的名称附着在不同的地方

它并没有直接连接到全局上下文那么糟糕,但是清楚地看到您使用的东西来自哪里(构造函数或模块)当然更好

2) 测试

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

对于全局
进程.ncof
要求(“设置”)
模式,您需要执行以下操作:

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件事情)。相比之下,这里介绍了如何使用依赖项注入(构造函数)模式


请注意,nconf是一个单例

我使用在程序开始时进行配置,然后当我需要在另一个文件中进行设置时,我会:

var nconf = require ('nconf');
nconf.get('x');

请注意,nconf是一个单例

我使用在程序开始时进行配置,然后当我需要在另一个文件中进行设置时,我会:

var nconf = require ('nconf');
nconf.get('x');

请显示您自己使用此库的代码,以便我们可以看到您在其中使用它的上下文。与不显示实际代码的理论问题相比,使用您自己的代码的问题通常会得到更好的答案。我将添加一些infoPlease show your own code以使用此库,这样我们就可以查看您在其中使用它的上下文。使用自己代码的问题通常比不显示实际代码的理论问题得到更好的答案。我将添加一些信息。我添加了一些信息,请让我知道它是否仍然有气味解决问题1(可发现性)。对问题2(测试)没有帮助。所以,它更好,但不是很好。IMO.什么是可发现性?我添加了一些信息,请让我知道它是否仍然可以解决问题1(可发现性)。对问题2(测试)没有帮助。所以,它更好,但不是很好。什么是可发现性?