JavaScript >> Javascript 文檔 >  >> Node.js

使用 dotenv 在 Node.js 中管理環境變量

簡介

部署應用程序需要開發人員對它的配置方式進行思考和考慮。許多應用程序在部署到生產環境之前部署在開發環境中。我們需要確保每個環境都配置正確,例如,如果我們的生產應用程序使用我們的開發數據庫,這可能是災難性的。

環境變量 允許我們獨立於代碼庫管理應用程序的配置。分離配置讓我們的應用更容易部署在不同的環境中。

大型應用程序往往具有許多環境變量。為了更好地管理它們,我們可以使用 dotenv 庫,它允許我們從文件中加載環境變量。

什麼是環境變量?

從編程中我們知道變量是可以更改的存儲值。它們是可變的並且可以變化 - 因此名稱 variables .

環境變量 是我們應用程序外部的變量,它們駐留在操作系統或應用程序運行的容器中。環境變量只是映射到值的名稱。

按照慣例,名稱是大寫的,例如[email protected] .值是字符串。

如果您在 Linux、Mac OS 或 Windows 中打開終端或命令行應用程序並輸入 set ,您將看到您的用戶的所有環境變量的列表。

為什麼要使用環境變量?

環境變量非常適合解耦應用程序配置。通常,我們的應用程序需要設置許多變量才能使其工作。通過依賴外部配置,您的應用可以輕鬆部署在不同的環境中。這些更改獨立於代碼更改,因此不需要重新構建您的應用程序即可更改。

根據您的應用程序運行的環境而變化的數據應設置為環境變量。一些常見的例子是:

  • HTTP 端口和地址
  • 數據庫、緩存和其他存儲連接信息
  • 靜態文件/文件夾的位置
  • 外部服務端點
    • 例如,在開發環境中,您的應用將指向測試 API URL,而在生產環境中,您的應用將指向實時 API URL。

API 密鑰等敏感數據不應包含在源代碼中,也不應為不需要訪問這些外部服務的人所知。

Node.js 中的環境變量

考慮一個 hello world Node.js 應用程序,其中包含應用程序運行所在的主機和端口的環境變量。

創建一個名為 hello.js 的新文件 在您選擇的工作區中添加以下內容:

const http = require('http');

// Read the host address and the port from the environment
const hostname = process.env.HOST;
const port = process.env.PORT;

// Return JSON regardless of HTTP method or route our web app is reached by
const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end(`{"message": "Hello World"}`);
});

// Start a TCP server listening for connections on the given port and host
server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Node.js 提供了一個全局變量 process.env , 一個對象,其中包含運行應用程序的用戶可用的所有環境變量。它期望應用程序將運行的主機名和端口由環境定義。

您可以通過在終端中輸入此命令 HOST=localhost PORT=3000 node hello.js 來運行此應用程序 ,假設你已經安裝了 Node.js。您會在控制台上看到以下消息:

Server running at http://localhost:3000/

創建和讀取環境變量就是這麼簡單。假設我們正在編寫一個與 MySQL 和 Redis 實例通信的微服務,我們希望在我們的環境變量中也提供連接詳細信息。

我們最終可能會得到這樣的命令:

$ DB_HOST=localhost DB_PORT=3306 DB_USER=test DB_PASSWORD=verySecret123!$ DB_MAX_CONNECTIONS=15 CACHE_ADDR=localhost CACHE_PORT= 6379 HOST=localhost PORT=3000 node hello.js

使用多個環境變量進行開發很快就會變得笨拙。如果我們必須配置的環境變量像文件一樣存儲在應用程序的一個中心位置會更好。

dotenv 庫

這個庫做了一個簡單的任務:從 .env 加載環境變量 文件放入 process.env Node.js 中的變量。讓我們使用 dotenv 對於前面的例子。

首先,我們需要通過 npm 安裝它 :

$ npm init # Optional, creates a local package.json that prevents global installs
$ npm install dotenv --save

然後我們做一個最小的代碼更改,將這一行添加到 hello.js 的頂部 :

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

require('dotenv').config()

現在在您的應用程序的同一目錄中,創建一個名為 .env 的新文件 並添加以下內容:

HOST=localhost
PORT=3000

您的環境變量的聲明就像您在運行 node 命令之前在 shell 中輸入它們一樣。我們不是用空格分隔每個變量賦值,而是用 換行符 分隔它們 .現在在你的 shell 中,如果你輸入 node hello.js ,應用程序將在端口 3000 上運行 在你的 localhost

即使 dotenv 在應用程序中使用,它是完全可選的。如果沒有 .env 找到文件時,庫會靜默失敗。可以繼續使用文件外定義的環境變量。

注意 :dotenv 也有很多變體 跨其他編程語言和框架。構建現代 Web 應用程序的一個非常流行的指南是十二要素應用程序。該文檔由許多創建軟件即服務應用程序的開發人員創建。現代可擴展應用程序的 12 個考慮因素之一是配置,特別是使用環境變量來存儲配置。這種方法的流行有助於推動 dotenv 的創建和流行 和類似的模塊。

生產使用情況

將環境變量存儲在文件中有一條黃金法則:永遠不要將其提交到源代碼存儲庫。您不希望外人獲取機密信息,例如 API 密鑰。如果您使用的是 dotenv 為了幫助管理您的環境變量,請務必包含 .env .gitignore 中的文件 或適用於您的版本控制工具的黑名單。

如果您無法提交 .env 文件,那麼開發人員需要通過某種方式來了解運行軟件所需的環境變量。開發人員通常會在 README 中列出運行程序所需的環境變量 或類似的內部文檔。

一些開發人員創建和維護 .sample-env 源代碼存儲庫中的文件。此示例文件將列出應用程序使用的所有環境變量,例如:

HOST=
PORT=

然後,開發人員將克隆存儲庫,複製 .sample-env 文件到一個新的 .env 文件並填寫值。

如果您的應用在物理機或虛擬機上運行(例如,Digital Ocean droplets、Amazon EC2 和 Azure 虛擬機),那麼您可以創建 .env 登錄到服務器後,它會像在本地機器上一樣運行。

如果您的應用在 docker 容器或 Heroku 或 Openshift 等平台即服務提供商上運行,那麼您將能夠配置環境變量而無需使用 .env 文件。

記住 ,它會靜默失敗,因此即使文件丟失也不會影響應用程序的運行。

結論

環境變量存在於我們的應用程序代碼之外,它們在我們的應用程序運行的地方可用。它們可用於將我們的應用程序配置與其代碼解耦,從而使我們的應用程序可以輕鬆地部署在不同的環境中。

對於 Node.js 應用程序,環境變量可通過 process.env 全局變量。我們可以在運行 node 之前設置環境變量 命令,或者我們可以使用 dotenv 允許我們在 .env 中定義環境變量的庫 文件。

.env 文件不應該在源代碼存儲庫中。


Tutorial JavaScript 教程
  1. 建立一個測驗應用程序 | JavaScript 項目教程(視頻格式)

  2. 5 分鐘學會 TypeScript - 初學者教程

  3. 反應路由器 6:重定向

  4. 快照測試 React with Jest

  5. 顯示多張隨機圖像,而不僅僅是一張

  6. 茉莉花中的條件測試用例

  7. iScroll 簡介

  1. 10 個 Jquery Ajax 文件上傳器插件

  2. 桌面 Safari 瀏覽器和 HTTP 實時流式傳輸

  3. 使用 Javascript 解析 URL

  4. RisingStack 介紹 React Easy State

  5. 關於事件循環的真相🍦(第 1 部分)

  6. 將 Commitizen 與您的 node.js 項目集成

  7. 停止輸入表單的字符

  1. 數據庫索引

  2. 初學者嘗試創建一個 Javascript 秒錶。

  3. 使用 IntelliJ IDEA 設置 TypeScript 項目

  4. JavaScript:Promise 以及為什麼 Async/Await 會勝出