Node.js 環境變數 false 仍然啟用?process.env 布林解析與啟動檢查
已經設定 FEATURE_ENABLED=false,if (process.env.FEATURE_ENABLED) 還是進入啟用分支,因為拿到的是非空字串 'false'。Boolean('false') 和 !!'false' 都是 true;要判斷設定的意思,必須明確解析字串。
Node.js 環境變數文件說明,.env 的值解析後是文字,即使看起來像 true、數字或 JSON 也一樣。這篇處理 Node.js 執行時的設定,不涵蓋 Vite 的建置期替換;前端專案可先看 Vite .env 與 mode。
別把「沒設定」與「拼錯」都當成關閉
最短寫法 raw === 'true' 能辨認單一啟用值,但 'ture'、空字串、'TRUE' 都會靜默變成 false。對需要部署者明確設定的開關,啟動失敗比帶著拼錯的值繼續跑更容易定位。
下面的政策只接受小寫 true/false;未設定使用指定預設值,空字串與其他內容拒絕。若團隊要接受 1/0 或大小寫變體,應逐項加入允許清單,而不是靠 truthiness 猜測。
將以下內容存為 env-boolean.mjs,以 node env-boolean.mjs 執行:
import assert from 'node:assert/strict';
function parseEnvBoolean(raw, fallback = false) { if (typeof fallback !== 'boolean') throw new TypeError('預設值必須是布林'); if (raw === undefined) return fallback; if (raw === 'true') return true; if (raw === 'false') return false; throw new TypeError('設定只接受 true 或 false');}
assert.equal(Boolean('false'), true);assert.equal(parseEnvBoolean('false'), false);assert.equal(parseEnvBoolean('true'), true);assert.equal(parseEnvBoolean(undefined), false);assert.equal(parseEnvBoolean(undefined, true), true);for (const raw of ['', '0', '1', 'TRUE', ' true ', 'ture', false, null]) { assert.throws(() => parseEnvBoolean(raw), TypeError);}assert.throws(() => parseEnvBoolean(undefined, 'false'), TypeError);console.log('布林解析契約檢查通過');沒有直接使用 JSON.parse(),是因為那會接受這個開關契約之外的數字、陣列或 null;即使 JSON 合法,也還要檢查結果型別。
用子程序確認傳進 Node 的確實是字串
只測 helper,無法確認程序邊界。以下範例以合成環境啟動目前的 Node 執行檔,只輸出測試開關,不列印整份 process.env:
import assert from 'node:assert/strict';import { execFileSync } from 'node:child_process';
const output = execFileSync(process.execPath, ['-e', ` const raw = process.env.FEATURE_ENABLED; console.log(JSON.stringify({ type: typeof raw, raw, truthy: Boolean(raw) }));`], { env: { FEATURE_ENABLED: 'false' }, encoding: 'utf8',});assert.deepEqual(JSON.parse(output), { type: 'string', raw: 'false', truthy: true,});console.log('子程序環境字串檢查通過');這個子程序不繼承真實帳號的環境設定,也沒有讀取專案 .env。若要測檔案載入流程,需依專案實際使用的 Node CLI 或 dotenv 套件另加測試;不能把這組結果當成所有 loader 的優先順序證明。
在服務啟動時建立一次設定
實際程式可在載入設定處呼叫 parseEnvBoolean(process.env.FEATURE_ENABLED, false),將回傳的布林存進 config.featureEnabled,供後續業務邏輯使用。錯誤訊息標示變數名稱與允許格式即可,不必把其他環境變數或憑證一起寫進 log。
預設值應依功能契約決定;範例的 false 不是所有安全、寄信或資料處理開關的共同答案。若設定是必填項,應把 undefined 也改成錯誤,並在開始接收請求前完成驗證。
改好 parser 後仍讀到舊值,下一步才是確認實際程序是否重新建立。Docker Compose 的 restart 不會重新載入修改過的容器環境,這個問題另見 Compose 環境變數未生效。本文維護流程只執行兩組 Node.js 範例,沒有部署服務、重建容器或修改任何正式設定。
參考資料: