精讀《如何在 nodejs 使用環境變量》

1 引言

本期精讀的文章是:如何在 nodejs 使用環境變量javascript

介紹了開發與生產環境如何管理環境變量。java

這裏環境變量指的是數據庫密碼等重要數據,而不是指普通變量傳參。node

2 概述

環境變量歷史悠久,在運行第一行 JAVA 代碼以前,你就得將環境變量設置好。react

image

可問題是,系統變量並不易用,好比結尾是否要使用分號,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

使用 .env 文件

很顯然,命令行寫不下了就寫到文件裏:數據庫

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 啓動配置

image

VSCode 能夠配置 Node 啓動配置,在這裏能夠設置環境變量:

image

爲了和 .env 文件打通,咱們能夠在配置裏設置 envFile 屬性:

{
  "envFile": "${workspaceFolder}/.env"
}
複製代碼

程序中依然使用 dotenv 讀取環境變量。這麼作將配置保留在 VSCode 中,而不是代碼中,不用再擔憂不當心上傳了配置文件啦!

使用 Npm Scripts

做者推薦了一個良好的習慣:使用 npm start 運行項目,而不是暴露出 Node 命令。那麼首先在 VSCode launch.json 中配置 Npm 模式:

image

記住,須要給 Node 腳本添加 --inspect 參數,才能觸發 VSCode debugger 的鉤子:

image

這樣一來,經過 npm start 就能夠啓動 Node,並讀取配置在 VSCode 的環境變量。

生產環境的環境變量

上面介紹了本地開發如何使用環境變量,但在生產環境,環境變量必須得換個方式管理。

不知道做者與微軟是什麼關係,這塊推薦了微軟的 Azure 管理環境變量。

主要思路是經過一個不賺差價的中間商提供環境變量管理服務。經過 Azure CLI 啓動你的 Node 項目,就能夠從雲服務平臺拿到環境變量信息。

3 精讀

環境變量管理是很是重要的問題,之前還看到將公司數據庫密碼提交到 Github 的例子,反面教材很是多。

本文介紹了許多本地開發使用環境變量的方式,筆者補充一下生產環境使用環境變量的經驗。

私有部署

若是你在一個高自動化運維水平的公司,這個問題已經被私有 Git + 私有云服務器自然解決了。

image

是的,部署私有 Git,把數據庫密碼提交到 Git 倉庫纔是最完美的方案!

持久化配置服務

經過自建,或者開源的 Azure 持久化配置服務存儲環境變量,在服務器利用 SDK 獲取它。

通常雲服務商都會打包這項服務,由於只有服務器和持久化配置服務都由一個供應商提供,供應商才能將持久化配置與服務器權限造成關聯,讓第三方服務器即使拿到 Token 也沒法訪問配置。

加密服務

若是安全級別特別高,內部 Git 都不容許提交,又要防止第三方(好比某寬帶運營商)攔截到信息,就要使用加密服務了。

流程通常是:

  1. 在加密平臺註冊,拿到密鑰。
  2. 在加密平臺設置環境變量,加密平臺會對內容進行加密。
  3. 利用 Node SDK 獲取到加密平臺輸出的密文。
  4. 利用 SDK 和密鑰解密成明文。

4 總結

對待在基礎設施完備公司的同窗,可能不須要關心環境變量安全性問題。對於本身搭建博客,或者使用第三方服務器的同窗,這篇文章告訴咱們三個注意點:

  1. 不要將重要環境變量提交到公開的 Git 倉庫。
  2. 本地經過 VSCode 調試環境變量既方便又安全。
  3. 生產環境經過雲服務商提供的環境變量配置服務拿到環境變量。

5 更多討論

討論地址是:精讀《如何在 nodejs 使用環境變量》 · Issue #89 · dt-fe/weekly

若是你想參與討論,請點擊這裏,每週都有新的主題,週末或週一發佈。

相關文章
相關標籤/搜索