嘿各位,我試著用 Claude 來調試這個問題,但沒有真正解決,所以我想知道是否有人可以幫忙。說明如下:
我有一個 Webhook → IF v2 工作流程,其中 IF 比較查詢參數與專案變數。兩者都解析為相同的字串,但 IF 總是路由到 FALSE。唯一的解決方法是用字面值替換變數參考,但這違反了原意。
設定
- n8n Cloud,版本 1.123.43
- 全域變數:鍵
staff_key,值b8133d71b3f96bc630e3bb0a,範圍為 Global - Webhook 接收的 URL:
?staff_key=b8133d71b3f96bc630e3bb0a - IF v2 單一條件:
- 值 1:
{{ $json.query.staff_key }}(運算式) - 運算子:
String → is equal to - 值 2:
{{ $vars.staff_key }}(運算式) - 選項 → 「必要時轉換類型」:開啟
- 值 1:
診斷
我在 Webhook 和 IF 之間插入了一個代碼節點,用原始 JavaScript 檢查值:
const fromUrl = $json.query.staff_key;
const fromVar = $vars.staff_key;
return {
fromUrl,
fromUrl_length: fromUrl?.length,
fromUrl_type: typeof fromUrl,
fromVar,
fromVar_length: fromVar?.length,
fromVar_type: typeof fromVar,
strict_equal: fromUrl === fromVar,
loose_equal: fromUrl == fromVar
};
輸出:
fromUrl: "b8133d71b3f96bc630e3bb0a"
fromUrl_length: 24
fromUrl_type: "string"
fromVar: "b8133d71b3f96bc630e3bb0a"
fromVar_length: 24
fromVar_type: "string"
strict_equal: true
loose_equal: true
所以在 JS 層級,這兩個值完全相同、類型相同,且 === 和 == 都返回 true。
我嘗試過的方法
- 切換「必要時轉換類型」的開啟和關閉 — 沒有差異,兩者都路由到 FALSE。
- 刪除並重新建立變數以排除尾部空白。
- 在嘗試之間重新保存工作流程並重新監聽測試事件。
- 將值 1 設為
{{ $json.query.staff_key }},值 2 設為字面字串b8133d71b3f96bc630e3bb0a,同時刪除全域變數 staff_key — 這立即生效並正確區分。
問題
Why does the IF v2 node refuse to evaluate $vars.X === $json.Y as true when raw JavaScript confirms they are strict-equal strings? 當原始 JavaScript 確認它們是嚴格相等的字串時,IF v2 節點為什麼拒絕評估 $vars.X === $json.Y 為 true?$vars 和 $json 在呈現給 IF 節點的內部評估器時,是否存在已知的類型包裝差異?是否有保留變數參考的解決方法?
工作流程目前使用字面值運行良好,但我寧願透過變數路由機密以便未來輪換。