使用 node-config 在 Node.js 中創建配置文件

管理跨不同環境的多個配置文件可能具有挑戰性,並且有多種工具正試圖用不同的方法解決這個問題。但是,在本文中,我們將學習如何使用 node-config [1] 跨不同部署環境創建和管理 Node.js 配置文件。
node-config是什麼?
Node-config允許你在你的Node應用程序中為不同的部署環境創建配置文件。有了它,你可以定義一個你打算跨環境重複使用的默認配置文件,然後將默認配置擴展到其他環境,如開發、暫存等。
你可以使用一些臨時的命令行參數來覆蓋這些參數,比如在你的命令行參數中加入 NODE_ENV=development
。
Node-config使創建和管理一個在所有部署環境中共享的一致的配置界面變得更加容易。
為了更好地理解如何設置這個配置,讓我們使用一個Node應用樣本。首先,在你的終端上運行下面的命令來克隆這個資源庫,或者從這裏下載並解壓它。
git clone https://github.com/ezesundayeze/node-env-sample
要安裝 Node 依賴項,請運行:
npm install
設置 node-config
因為node-config是一個npm包,我們可以通過運行這些命令中的任何一個來用npm或yarn安裝它。
npm install config
或者
yarn add config
支持的 node-config 文件擴展名
Node-config 支持許多文件擴展名。在發佈時,當前版本的 node-config (3.3.6) 支持以下擴展:
- .json - .json5 - .hjson - .yaml or .yml - .coffee - .js - .cson - .properties - .toml - .ts - .xml
這意味着你可以用任何一個支持的擴展來創建你的配置文件,但為你的項目選擇一個擴展並在整個構建過程中堅持使用它是有意義的。
在本教程中,我們將使用 .json
擴展名。
創建默認環境變量
創建一個 config
目錄並向其中添加一個 config/default.json
文件。這將是默認配置文件,並將包含所有默認環境變量。
在我們的示例應用程序中它應該是這樣的:
config/default.json
{ "server": { "host": "localhost", "port": 0, } }
我們將在我們的應用程序中通過導入 config
和使用 get
方法訪問變量來訪問它。
const config = require('config'); const port = config.get('server.port'); const host = config.get('server.host');
讓我們創建一個 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}`); });
你可以在你的應用程序的其他部分以類似的方式使用node-config。
擴展默認配置文件
你可以通過創建其他配置文件來擴展默認的配置文件。例如,你可以為開發、生產、QA、暫存、本地等創建配置文件。讓我們來介紹一下我們將在我們的應用程序中使用的配置文件的主要類型。

本地配置文件
創建本地配置文件是為了覆蓋你的配置文件的部署版本。例如,對於你的開發部署,你可以有一個 local-development.json
文件來存儲你所有的本地開發配置——它反映了你在部署的開發環境中期望的那種行為。
因此,你可以擁有這樣的東西:
local-{instance}.EXT local-{deployment}.EXT local-{deployment}-{instance}.EXT
短主機名和完整主機名
你也可以使用簡短和完整的主機名來定義你在特定平台上的配置文件,以防你要在多個實例上進行部署。例如,您可以有一個 {short_hostname}
,它將代表您的服務器名稱直到第一個點。如果您的主機名是 demo.example.com
,則配置可以是 demo.EXT (demo.json)
。
此外,如果您的 {full_hostname}
是您的整個服務器名稱,則您可以在 {short_hostname}
與其他機器發生衝突時使用它。因此,在您的主機名是 demo.example.com
的情況下,您的配置文件名將是 demo.example.com.json
。
自定義配置文件
你可能還想創建一個自定義的配置文件來容納一些環境變量的覆蓋。Node-config提供了對配置文件類型的支持,你可以用 custom-environment-variables.EXT(custom-environment-variables.json)
的名字來定義。
測試配置值
如果您的環境變量沒有設置,使用它們的服務就會中斷。所以,你應該確保你的環境變量已經過測試。Node-config 提供了多個實用程序,其中之一是 config.has()
方法,它允許您驗證是否設置了環境變量。
你可以創建一個測試文件或將其添加到你的預提交鈎子中,以確保你的配置文件都已設置好。
以下是如何使用 config.has()
檢查配置變量是否存在的示例:
if (config.has('dbConfig')) { ... }
你也可以在你的Jest測試中使用它,像這樣:
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); });
使用命令行重寫
使用命令行覆蓋允許你從你的終端或命令行中即時指定配置參數。你需要在啟動應用程序時通過指定 NODE_CONFIG='{...}'
命令來設置配置,參數必須是JSON字符串的格式。
下面是一個例子:
NODE_CONFIG='{"server": {"host":"192.168.43.13", "port":"3030"}}' npm run dev

JSON 值周圍的單引號允許您安全地使用雙引號。在某些情況下,根據您的操作系統,您可能需要對某些字符進行轉義。您還可以使用命令行導出來避免一直鍵入命令。
在你的終端上運行下面的命令將覆蓋你的服務器的主機和端口或你選擇覆蓋的任何其他配置。
export NODE_CONFIG='{"server": {"host":"192.168.43.13", "port":"3030"}}'
如果您更喜歡使用 JavaScript,可以在調用配置庫之前將其添加到您的服務器文件中,如下所示:
const express = require('express'); process.env.NODE_CONFIG = '{"server": {"host":"localhost", "port":"3030"}}'; const config = require('config');
訣竅是在配置加載之前將 NODE_CONFIG
變量設置為 JSON 字符串。
發生這種情況是因為命令行覆蓋優先於所有其他類型的覆蓋。下面是一些在使用 node-config 時不能用作環境變量的保留字,因為庫提供了它們的實現,可能會與您的實現衝突。
get has util getConfigSources makeHidden makeImmutable setModuleDefaults watch _attachProtoDeep _cloneDeep _diffDeep
這不是一個詳盡的列表,所以一定要查看文檔。
有一些插件可以讓你高效地使用 node-config 和 Docker 來管理密鑰,一個插件可以讓你自動 重新加載 node-config [2] (你可能已經知道,配置不會在文件更改時自動加載),以及允許您 取消緩存您的配置(uncache your config) [3] 變量的插件。
總結
使用 node-config 時,有無數種方法可以配置您的 Node 應用程序。有了它,您可以輕鬆管理您的配置文件並根據需要擴展它們,從而在您的項目中實現最大的靈活性、可靠性和一致性。謝謝閲讀。
原文:https://blog.logrocket.com/creating-configuration-files-node-js-using-node-config/
參考資料
node-config: https://github.com/lorenwest/node-config
重新加載 node-config: https://github.com/MrBoolean/node-config-uncached
取消緩存您的配置(uncache your config): https://www.npmjs.com/package/config-reloadable
猜你喜歡
- 將自定義 GitHub 徽章添加到您的代碼庫
- 使用 web-vitals 監控 web app 的性能
- 真沒必要再對 axios 進行過度的封裝
- 你應該知道的 7 個 GitHub 功能
- 集美美圖APP 2.0.0 版本上線了
- 你的應用應該如何收費?它的價值是什麼?
- xgplayer.js 西瓜播放器 - 字節跳動團隊出品的免費開源 HTML5 視頻播放組件,內置解析器、也能節省流量
- 2天,我把 TS 的事件循環模型、服務端、模擬登陸擼乾淨了!
- 8 個令人驚歎的 Vue.js UI 組件,説不定用得上!
- Vue.js Astro 比 Vue SPA 更好嗎?
- 使用 node-config 在 Node.js 中創建配置文件
- 2022年全棧開發者需要具備的六項技能
- 使用 Chrome Web 藍牙 API 構建藍牙應用
- 生成唯一ID,為什麼 NanoID 會取代 UUID?
- 在 Flutter 中更快地加載圖像資源!
- Clio lang 簡介:輕鬆交付性能關鍵型 JS
- 20個你應該瞭解的Flutter庫
- 厭倦了 VS Code?試試 Lite-XL吧
- 新的Vue 3 應用程序初始化代碼的好處
- 使用 Face-api.js 在 Web 上進行人臉檢測