IF v2 節點儘管字串相同,$vars.X === $json.Y 仍路由 FALSE (Cloud v1.123.43)

嘿各位,我試著用 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 }}(運算式)
    • 選項 → 「必要時轉換類型」:開啟

診斷

我在 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 節點的內部評估器時,是否存在已知的類型包裝差異?是否有保留變數參考的解決方法?

工作流程目前使用字面值運行良好,但我寧願透過變數路由機密以便未來輪換。

1個讚

既然你已經有一個用於診斷的 Code 節點,就在該 Code 節點中執行檢查,並簡單地輸出一個布林值:

return {
  isValid: $json.query.staff_key === $vars.staff_key
};

然後,將你的 IF 節點設定為:{{ $json.isValid }} -→ Boolean -→ is true

這樣有幫助嗎?

1個讚

嘿,非常謝謝你!這確實有幫助 :slight_smile:

2個讚

很高興知道這一點