2015-04-19 143 views
1

我为我的node.js Express Web服务器使用名为nconf的环境变量和参数解析模块。将对象附加到Node.js进程

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

坦率地说,我挺喜欢这种解决方案。现在我可以在任何地方检索配置数据,而无需使用模块。但是这可能会有不利因素......并且这可能是一个非常糟糕的主意。 IDK。

+1

请出示您自己的代码使用这个库,所以我们可以看到的背景下,你正在使用它。与自己的代码相比,问题几乎总能得到比不显示实际代码的理论问题更好的答案。 – jfriend00

+0

我会添加一些信息 –

回答

3

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

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

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

例如,

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

//... 

global.api = new Api(global); 

//... 

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

UPDATE:为什么原来的模式是不好的更多信息:

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(); 
} 
+0

我添加了一些信息,请让我知道如果它仍然有气味 –

+0

它仍然是不好的国际海事组织。看到我的第二句话的观点。 – panta82

+0

感谢您的信息很有意义 –

1

请注意,nconf是一个单身人士。

我用在节目的一开始配置,然后当我需要在另一个文件中的设置我做:

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

有趣 –