830 字
4 分鐘

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 範例,沒有部署服務、重建容器或修改任何正式設定。

參考資料:

Node.js 24:Environment Variables

Node.js 24:process.env

MDN:Boolean

Node.js 環境變數 false 仍然啟用?process.env 布林解析與啟動檢查
https://laplusda.com/posts/node-env-false-boolean-parsing/
作者
Zero
發佈於
2026-11-02
許可協議
CC BY-NC-SA 4.0