4.2 環境變數與設定管理#
為什麼設定不能寫死在程式碼裡?#
資料庫密碼、API Key、port 號——這些設定如果寫死在程式碼裡:
- 換環境就要改程式:開發機和正式伺服器的設定不同
- 機密外洩: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,再填入自己的機密即可。
黃金法則#
- 機密一律走環境變數,程式碼裡不出現任何密碼或 Key
.env進 .gitignore,.env.example進 Git- 程式啟動時檢查必要環境變數是否存在,缺了就明確報錯:
if (!process.env.DATABASE_URL) {
console.error("缺少環境變數 DATABASE_URL,請參考 .env.example");
process.exit(1);
}
已經不小心 commit 了機密?只刪檔案不夠——歷史裡還在。立刻更換該機密(改密碼、作廢 Key),這是唯一可靠的補救。