本期精讀的文章是:如何在 nodejs 使用環境變量。javascript
介紹了開發與生產環境如何管理環境變量。java
這裏環境變量指的是數據庫密碼等重要數據,而不是指普通變量傳參。node
環境變量歷史悠久,在運行第一行 JAVA 代碼以前,你就得將環境變量設置好。react
可問題是,系統變量並不易用,好比結尾是否要使用分號,JAVA_HOME 與 PATH 在哪些程序中功能相同?並且與操做系統綁定,在操做系統級別設置的變量,給 JAVA 級別的程序用還好,但用來存數據庫密碼就不合適了。git
在 Node 中,咱們怎樣使用環境變量呢?做者給出了以下的建議:github
PORT=65534 node bin/www
這是最基本、最經常使用的方式,但是當變量數量過多,難免以爲很崩潰:web
PORT=65534 DB_CONN="mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:19373/?ssl=true&replicaSet=globaldb" SECRET_KEY=b6264fca-8adf-457f-a94f-5a4b0d1ca2b9 node bin/www
做者提到,這種代碼沒有拓展性。做者認爲,對工程師來講,可拓展性甚至比能正確運行更爲重要。mongodb
很顯然,命令行寫不下了就寫到文件裏:數據庫
PORT=65534 DB_CONN="mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:10255/?ssl=true&replicaSet=globaldb" SECRET_KEY="b6264fca-8adf-457f-a94f-5a4b0d1ca2b9"
經過 dotenv
這個 npm 包能夠讀取 .env 文件的配置到 Nodejs 程序中。npm
npm install dotenv --save
安裝後,直接調用它解析,就能夠從環境變量中拿到 .env 文件的配置信息了:
require("dotenv").config(); var MongoClient = require("mongodb").MongoClient; // Reference .env vars off of the process.env object MongoClient.connect( process.env.DB_CONN, function(err, db) { if (!err) { console.log("We are connected"); } } );
這有個問題,不要將配置文件發送到 Git 倉庫,可能會泄漏隱私數據。然而 VSCode 幫你解決了這個問題(什麼,你不用 VSCode?)
VSCode 能夠配置 Node 啓動配置,在這裏能夠設置環境變量:
爲了和 .env 文件打通,咱們能夠在配置裏設置 envFile
屬性:
{ "envFile": "${workspaceFolder}/.env" }
程序中依然使用 dotenv
讀取環境變量。這麼作將配置保留在 VSCode 中,而不是代碼中,不用再擔憂不當心上傳了配置文件啦!
做者推薦了一個良好的習慣:使用 npm start
運行項目,而不是暴露出 Node 命令。那麼首先在 VSCode launch.json
中配置 Npm 模式:
記住,須要給 Node 腳本添加 --inspect
參數,才能觸發 VSCode debugger 的鉤子:
這樣一來,經過 npm start
就能夠啓動 Node,並讀取配置在 VSCode 的環境變量。
上面介紹了本地開發如何使用環境變量,但在生產環境,環境變量必須得換個方式管理。
不知道做者與微軟是什麼關係,這塊推薦了微軟的 Azure 管理環境變量。
主要思路是經過一個不賺差價的中間商提供環境變量管理服務。經過 Azure CLI 啓動你的 Node 項目,就能夠從雲服務平臺拿到環境變量信息。
環境變量管理是很是重要的問題,之前還看到將公司數據庫密碼提交到 Github 的例子,反面教材很是多。
本文介紹了許多本地開發使用環境變量的方式,筆者補充一下生產環境使用環境變量的經驗。
若是你在一個高自動化運維水平的公司,這個問題已經被私有 Git + 私有云服務器自然解決了。
是的,部署私有 Git,把數據庫密碼提交到 Git 倉庫纔是最完美的方案!
經過自建,或者開源的 Azure 持久化配置服務存儲環境變量,在服務器利用 SDK 獲取它。
通常雲服務商都會打包這項服務,由於只有服務器和持久化配置服務都由一個供應商提供,供應商才能將持久化配置與服務器權限造成關聯,讓第三方服務器即使拿到 Token 也沒法訪問配置。
若是安全級別特別高,內部 Git 都不容許提交,又要防止第三方(好比某寬帶運營商)攔截到信息,就要使用加密服務了。
流程通常是:
對待在基礎設施完備公司的同窗,可能不須要關心環境變量安全性問題。對於本身搭建博客,或者使用第三方服務器的同窗,這篇文章告訴咱們三個注意點:
討論地址是: 精讀《如何在 nodejs 使用環境變量》 · Issue #89 · dt-fe/weekly
若是你想參與討論,請點擊這裏,每週都有新的主題,週末或週一發佈。