2015-04-19 92 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

有趣 –