詳解nodejs 配置文件處理方案
前言
一般來說:一個好的項目配置應該滿足以下條件:
- 依賴環(huán)境:配置根據具體運行環(huán)境從相應的文件讀取
- 代碼分離:配置項不僅可以從配置文件讀取, 也可以從環(huán)境變量讀取,使得安全隱秘的配置項與代碼分離
- 易于使用:配置項應該是分層配置的,有助于查找條目和維護龐大的配置文件的,應該是容易組織和容易獲取的,比如json結構
在多人開發(fā) nodejs 項目的時候,沒有規(guī)劃好配置方案,配置文件的問題就很容易暴露出來。
痛點
在開發(fā) nodejs 的工程中,遇到過三個痛點
- 部署環(huán)境不同: 開發(fā)、測試、生產環(huán)境的不同,導致配置的不同
- 開發(fā)環(huán)境不同: 開發(fā)者的開發(fā)環(huán)境配置不同,會存在同一個配置文件配置項不同,同一文件不同內容提交,容易引起 git 沖突,影響 git 提交更新
- 安全地配置: 一些配置不應該明文保存在項目代碼里面,比如數據庫密碼
解決方案
部署環(huán)境不同
對于部署環(huán)境不同,相對容易解決,建立相應環(huán)境的配置文件,比如:
- 開發(fā)環(huán)境配置:developmentConfig.js
- 測試環(huán)境配置:testConfig.js
- 生產環(huán)境配置:productionConfig.js
再建一個config.js配置文件作為入口獲取配置,如下:
module.exports = require(`./${process.env.NODE_ENV}Config.js`)
引用配置的時候,只要引用 config.js 即可。
運行命令如下:
NODE_ENV=development node index.js
開發(fā)環(huán)境不同
對于開發(fā)環(huán)境不同,導致每個人的developmentConfig.js不同,這個不能要求別人的配置和你的一樣,這樣項目就太硬了。
我們可以把developmentConfig.js添加到.gitignore,從而從項目分離出來,再在readme.md說明如何配置developmentConfig.js。
最好是建立一個developmentConfig.example.js,并在文檔說明復制成developmentConfig.js后修改配置項符合自己的開發(fā)配置。
安全地配置
對于項目一些安全性要求高的配置項,我們應該從配置文件脫離出來,只能在當前的運行進程可以獲取, 配置文件的配置項再讀取進程的配置項值,比如數據庫密碼, 一般做法如下:
productionConfig.js
module.exports = { database: { user: process.env.user || 'root', password: process.env.password || 'yfwzx2019' } }
而更隱秘的辦法是,你根本不知道我用環(huán)境變量覆蓋了配置項值,比如:
productionConfig.js
module.exports = { database: { user: 'root', password: 'yfwzx2019' } }
一般人拿到了這個配置,就會以為數據庫的賬號密碼就是root、yfwzx2019,其實最后會被環(huán)境變量的值覆蓋,運行如下:
node index.js --database.user=combine --database.password=tencent2019
當然,是要做了一些處理才可以這樣配置。
實操
方案有了,我們先來介紹以下 nodejs 的配置模塊 rc模塊
rc 模塊
使用rc模塊需要定義一個appname,選擇rc模塊是因為它會盡可能多的從appname命名相關的地方讀取配置。
使用也很簡單,先實例一個 rc 配置:
var conf = require('rc')(appname, defaultConfigObject)
然后它會從下面列表合并配置,優(yōu)先級按順序合并:
- 命令行參數:--user=root 或者對象形式賦值 --database.user=root
- 環(huán)境變量: 環(huán)境變量前綴為${appname}_的變量 appname_user=root 對象形式 appname_database__user=root
- 指定文件: node index.js --config file
- 默認配置文件: 從 ./ ../ ../../ ../../../等目錄查找.${appname}rc文件
- $HOME/.${appname}rc
- $HOME/.${appname}/config
- $HOME/.config/${appname}
- $HOME/.config/${appname}/config
- /etc/${appname}rc
- /etc/${appname}/config
做了個 demo, 直觀一點
var conf = require('rc')('development', { port: 3000, }) console.log(JSON.stringify(conf)) // 1、直接運行 // node index.js // { port: 3000, _: [] } // 2、加上命令行參數 // node index.js --port=4000 --database.user=root // { port: 4000, _: [], database: { user: 'root' } } // 3、加上環(huán)境變量 // development_port=5000 development_database__password=yfwzx2019 node index.js // {"port":"5000","database":{"password":"yfwzx2019"},"_":[]} // 4、指定配置文件:根目錄建一個配置文件 config.json, 內容如下 // { // "port": "6000" // } // node index.js --config=config.json // {"port":"6000","_":[],"config":"config.json","configs":["config.json"]} // 5、默認讀取 ${appname}rc 文件:根目錄見一個配置文件 .developmentrc 內容如下: // { // "port": 7000 // } // node index.js // {"port":7000,"_":[],"configs":[".developmentrc"],"config":".developmentrc"} // 6、 5 和4 一起運行 // node index.js --config=config.json // {"port":"6000","_":[],"config":"config.json","configs":[".developmentrc","config.json"]}
具體操作
看了 rc 模塊,可以滿足我們的需求,我們可以配置公共的配置項,也可以隱秘的覆蓋我們的配置項。
創(chuàng)建配置文件目錄,添加配置文件
├── config │ ├── .developmentrc.example │ ├── .productionrc │ ├── .testrc │ └── index.js
其中 .developmentrc.example 是開發(fā)環(huán)境的例子,然后開發(fā)人員參考建 .developmentrc 文件, index.js 是配置入口文件,內容如下:
let rc = require('rc') // 因為 rc 是從 process.cwd() 向上查找 .appnamerc 文件的,我們在根目錄 config 文件夾里面的是找不到的,要改變工作路徑到當前,再改回去 var originCwd = process.cwd() process.chdir(__dirname) var conf = rc(process.env.NODE_ENV || 'production', { // 默認的共同配置 origin: 'default', baseUrl: 'http://google.com/api', enableProxy: true, port: 3000, database: { user: 'root', password: 'yfwzx2019' } }) process.chdir(originCwd) module.exports = conf
- 關于部署環(huán)境的不同,獲取配置通過設置環(huán)境變量NODE_ENV來適配
- 關于開發(fā)環(huán)境的不同,在.gitignore添加config/.developmentrc,項目代碼去掉開發(fā)環(huán)境配置.developmentrc,開發(fā)人員根據.developmentrc.example建直接的開發(fā)配置.developmentrc
- 關于安全地配置,通過添加環(huán)境變量覆蓋默認值,可以安全隱秘地覆蓋配置項,比如:
NODE_ENV=production node index.js --database.password=tencent2019
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
windows如何把已安裝的nodejs高版本降級為低版本(圖文教程)
這篇文章主要介紹了windows如何把已安裝的nodejs高版本降級為低版本,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12package.json與package-lock.json創(chuàng)建及使用詳解
這篇文章主要為大家介紹了package.json與package-lock.json創(chuàng)建及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07Linux下為Node.js程序配置MySQL或Oracle數據庫的方法
這篇文章主要介紹了Linux下為Node.js程序配置MySQL或Oracle數據庫的方法,這里默認已經裝配好了Node環(huán)境然后我們利用npm包管理工具來進行配置,需要的朋友可以參考下2016-03-03Node.js實現mysql連接池使用事務自動回收連接的方法示例
這篇文章主要介紹了Node.js實現mysql連接池使用事務自動回收連接的方法,結合實例形式分析了node.js操作mysql連接池實現基于事務的連接回收操作相關技巧,需要的朋友可以參考下2018-02-02