跳轉到

4.2 環境變數與設定管理#

為什麼設定不能寫死在程式碼裡?#

資料庫密碼、API Key、port 號——這些設定如果寫死在程式碼裡:

  1. 換環境就要改程式:開發機和正式伺服器的設定不同
  2. 機密外洩:commit 進 Git,全世界都看得到你的密碼

解法:設定透過環境變數注入,程式碼只讀不寫。

讀取環境變數:process.env#

const PORT = process.env.PORT || 3000;           // 有設定就用,沒有就用預設值
const DB_URL = process.env.DATABASE_URL;
const API_KEY = process.env.STRIPE_KEY;

在終端機設定環境變數:

PORT=4000 node app.js     # macOS / Linux

dotenv:把設定寫在 .env 檔#

每次打環境變數太麻煩,慣例是把設定寫在專案根目錄的 .env 檔,用 dotenv 套件載入:

npm install dotenv

建立 .env:

PORT=3000
DATABASE_URL=postgres://user:password@localhost:5432/mydb
STRIPE_KEY=sk_test_xxx

在程式最前面載入:

import "dotenv/config";    // ESM 寫法,一行搞定

const PORT = process.env.PORT;

.env 檔的管理規則(重要)#

# .gitignore
.env
.env.local
檔案 內容 commit 嗎?
.env 真實機密設定 ❌ 絕對不要
.env.example 格式範本(無真實機密) ✅ 要

.env.example 範例:

PORT=3000
DATABASE_URL=postgres://user:password@localhost:5432/mydb
STRIPE_KEY=sk_test_xxx

新隊友 clone 專案後:cp .env.example .env,再填入自己的機密即可。

黃金法則#

  1. 機密一律走環境變數,程式碼裡不出現任何密碼或 Key
  2. .env 進 .gitignore,.env.example 進 Git
  3. 程式啟動時檢查必要環境變數是否存在,缺了就明確報錯:
if (!process.env.DATABASE_URL) {
  console.error("缺少環境變數 DATABASE_URL,請參考 .env.example");
  process.exit(1);
}

已經不小心 commit 了機密?只刪檔案不夠——歷史裡還在。立刻更換該機密(改密碼、作廢 Key),這是唯一可靠的補救。