使用 Node-Config 在 Node.Js 中創(chuàng)建配置文件
管理跨不同環(huán)境的多個(gè)配置文件可能具有挑戰(zhàn)性,并且有多種工具正試圖用不同的方法解決這個(gè)問(wèn)題。但是,在本文中,我們將學(xué)習(xí)如何使用 node-config[1] 跨不同部署環(huán)境創(chuàng)建和管理 Node.js 配置文件。
node-config是什么?
Node-config允許你在你的Node應(yīng)用程序中為不同的部署環(huán)境創(chuàng)建配置文件。有了它,你可以定義一個(gè)你打算跨環(huán)境重復(fù)使用的默認(rèn)配置文件,然后將默認(rèn)配置擴(kuò)展到其他環(huán)境,如開發(fā)、暫存等。
你可以使用一些臨時(shí)的命令行參數(shù)來(lái)覆蓋這些參數(shù),比如在你的命令行參數(shù)中加入NODE_ENV=development。
Node-config使創(chuàng)建和管理一個(gè)在所有部署環(huán)境中共享的一致的配置界面變得更加容易。
為了更好地理解如何設(shè)置這個(gè)配置,讓我們使用一個(gè)Node應(yīng)用樣本。首先,在你的終端上運(yùn)行下面的命令來(lái)克隆這個(gè)資源庫(kù),或者從這里下載并解壓它。
- git clone https://github.com/ezesundayeze/node-env-sample
要安裝 Node 依賴項(xiàng),請(qǐng)運(yùn)行:
- npm install
設(shè)置 node-config
因?yàn)閚ode-config是一個(gè)npm包,我們可以通過(guò)運(yùn)行這些命令中的任何一個(gè)來(lái)用npm或yarn安裝它。
- npm install config
或者
- yarn add config
支持的 node-config 文件擴(kuò)展名
Node-config 支持許多文件擴(kuò)展名。在發(fā)布時(shí),當(dāng)前版本的 node-config (3.3.6) 支持以下擴(kuò)展:
- - .json
- - .json5
- - .hjson
- - .yaml or .yml
- - .coffee
- - .js
- - .cson
- - .properties
- - .toml
- - .ts
- - .xml
這意味著你可以用任何一個(gè)支持的擴(kuò)展來(lái)創(chuàng)建你的配置文件,但為你的項(xiàng)目選擇一個(gè)擴(kuò)展并在整個(gè)構(gòu)建過(guò)程中堅(jiān)持使用它是有意義的。
在本教程中,我們將使用 .json 擴(kuò)展名。
創(chuàng)建默認(rèn)環(huán)境變量
創(chuàng)建一個(gè) config 目錄并向其中添加一個(gè) config/default.json 文件。這將是默認(rèn)配置文件,并將包含所有默認(rèn)環(huán)境變量。
在我們的示例應(yīng)用程序中它應(yīng)該是這樣的:
config/default.json
- {
- "server": {
- "host": "localhost",
- "port": 0,
- }
- }
我們將在我們的應(yīng)用程序中通過(guò)導(dǎo)入 config 和使用 get 方法訪問(wèn)變量來(lái)訪問(wèn)它。
- const config = require('config');
- const port = config.get('server.port');
- const host = config.get('server.host');
讓我們創(chuàng)建一個(gè) server.js 文件并添加以下代碼。
- const express = require('express');
- const config = require('config');
- const app = express();
- const port = config.get('server.port');
- const host = config.get('server.host');
- app.get('/', (req, res) => {
- res.send('Hello World');
- });
- const server = app.listen(port, host, (err) => {
- if (err) {
- console.log(err);
- process.exit(1);
- }
- console.log(`Server is running on ${host}:${server.address().port}`);
- });
你可以在你的應(yīng)用程序的其他部分以類似的方式使用node-config。
擴(kuò)展默認(rèn)配置文件
你可以通過(guò)創(chuàng)建其他配置文件來(lái)擴(kuò)展默認(rèn)的配置文件。例如,你可以為開發(fā)、生產(chǎn)、QA、暫存、本地等創(chuàng)建配置文件。讓我們來(lái)介紹一下我們將在我們的應(yīng)用程序中使用的配置文件的主要類型。
本地配置文件
創(chuàng)建本地配置文件是為了覆蓋你的配置文件的部署版本。例如,對(duì)于你的開發(fā)部署,你可以有一個(gè) local-development.json 文件來(lái)存儲(chǔ)你所有的本地開發(fā)配置——它反映了你在部署的開發(fā)環(huán)境中期望的那種行為。
因此,你可以擁有這樣的東西:
- local-{instance}.EXT
- local-{deployment}.EXT
- local-{deployment}-{instance}.EXT
短主機(jī)名和完整主機(jī)名
你也可以使用簡(jiǎn)短和完整的主機(jī)名來(lái)定義你在特定平臺(tái)上的配置文件,以防你要在多個(gè)實(shí)例上進(jìn)行部署。例如,您可以有一個(gè) {short_hostname},它將代表您的服務(wù)器名稱直到第一個(gè)點(diǎn)。如果您的主機(jī)名是 demo.example.com,則配置可以是 demo.EXT (demo.json)。
此外,如果您的 {full_hostname} 是您的整個(gè)服務(wù)器名稱,則您可以在 {short_hostname} 與其他機(jī)器發(fā)生沖突時(shí)使用它。因此,在您的主機(jī)名是 demo.example.com 的情況下,您的配置文件名將是 demo.example.com.json。
自定義配置文件
你可能還想創(chuàng)建一個(gè)自定義的配置文件來(lái)容納一些環(huán)境變量的覆蓋。Node-config提供了對(duì)配置文件類型的支持,你可以用 custom-environment-variables.EXT(custom-environment-variables.json)的名字來(lái)定義。
測(cè)試配置值
如果您的環(huán)境變量沒(méi)有設(shè)置,使用它們的服務(wù)就會(huì)中斷。所以,你應(yīng)該確保你的環(huán)境變量已經(jīng)過(guò)測(cè)試。Node-config 提供了多個(gè)實(shí)用程序,其中之一是 config.has() 方法,它允許您驗(yàn)證是否設(shè)置了環(huán)境變量。
你可以創(chuàng)建一個(gè)測(cè)試文件或?qū)⑵涮砑拥侥愕念A(yù)提交鉤子中,以確保你的配置文件都已設(shè)置好。
以下是如何使用 config.has() 檢查配置變量是否存在的示例:
- if (config.has('dbConfig')) {
- ...
- }
你也可以在你的Jest測(cè)試中使用它,像這樣:
- const config = require('config');
- test('Server config exist', () => {
- expect(config.has("server")).toBe(true);
- });
- test('Default config exist', () => {
- expect(config.has("server.port")).toBe(true);
- expect(config.has("server.host")).toBe(true);
- });
使用命令行重寫
使用命令行覆蓋允許你從你的終端或命令行中即時(shí)指定配置參數(shù)。你需要在啟動(dòng)應(yīng)用程序時(shí)通過(guò)指定 NODE_CONFIG='{...}' 命令來(lái)設(shè)置配置,參數(shù)必須是JSON字符串的格式。
下面是一個(gè)例子:
- NODE_CONFIG='{"server": {"host":"192.168.43.13", "port":"3030"}}' npm run dev
JSON 值周圍的單引號(hào)允許您安全地使用雙引號(hào)。在某些情況下,根據(jù)您的操作系統(tǒng),您可能需要對(duì)某些字符進(jìn)行轉(zhuǎn)義。您還可以使用命令行導(dǎo)出來(lái)避免一直鍵入命令。
在你的終端上運(yùn)行下面的命令將覆蓋你的服務(wù)器的主機(jī)和端口或你選擇覆蓋的任何其他配置。
- export NODE_CONFIG='{"server": {"host":"192.168.43.13", "port":"3030"}}'
如果您更喜歡使用 JavaScript,可以在調(diào)用配置庫(kù)之前將其添加到您的服務(wù)器文件中,如下所示:
- const express = require('express');
- process.env.NODE_CONFIG = '{"server": {"host":"localhost", "port":"3030"}}';
- const config = require('config');
訣竅是在配置加載之前將 NODE_CONFIG 變量設(shè)置為 JSON 字符串。
發(fā)生這種情況是因?yàn)槊钚懈采w優(yōu)先于所有其他類型的覆蓋。下面是一些在使用 node-config 時(shí)不能用作環(huán)境變量的保留字,因?yàn)閹?kù)提供了它們的實(shí)現(xiàn),可能會(huì)與您的實(shí)現(xiàn)沖突。
- get
- has
- util
- getConfigSources
- makeHidden
- makeImmutable
- setModuleDefaults
- watch
- _attachProtoDeep
- _cloneDeep
- _diffDeep
這不是一個(gè)詳盡的列表,所以一定要查看文檔。
有一些插件可以讓你高效地使用 node-config 和 Docker 來(lái)管理密鑰,一個(gè)插件可以讓你自動(dòng)重新加載 node-config[2](你可能已經(jīng)知道,配置不會(huì)在文件更改時(shí)自動(dòng)加載),以及允許您取消緩存您的配置(uncache your config)[3]變量的插件。
總結(jié)
使用 node-config 時(shí),有無(wú)數(shù)種方法可以配置您的 Node 應(yīng)用程序。有了它,您可以輕松管理您的配置文件并根據(jù)需要擴(kuò)展它們,從而在您的項(xiàng)目中實(shí)現(xiàn)最大的靈活性、可靠性和一致性。謝謝閱讀。
原文:https://blog.logrocket.com/creating-configuration-files-node-js-using-node-config/
參考資料
[1]node-config: https://github.com/lorenwest/node-config
[2]重新加載 node-config: https://github.com/MrBoolean/node-config-uncached
[3]取消緩存您的配置(uncache your config): https://www.npmjs.com/package/config-reloadable
本文轉(zhuǎn)載自微信公眾號(hào)「前端全棧開發(fā)者」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端全棧開發(fā)者公眾號(hào)。





























