有缺陷的未使用 Respond to Webhook 節點驗證

描述問題/錯誤/問題

您好,我有以下工作流程,webhook 立即回應,然後我有一個等待節點。向該節點發送請求後,我首先進行其他操作(在這個最小示例中,我對 example.com 進行 GET 請求),然後向等待節點回應成功。顯然,我的 webhook 配置為立即回應,我的等待節點配置為使用回應至 webhook 節點進行回應。出於某種原因,n8n 錯誤地告訴我回應至 webhook 節點未被使用(順便說一下,一個 ID 或任何類型的信息會很有幫助,但我找不到)。如果我移除所有回應至 webhook 節點,工作流程會正常進行,但我不想這樣做。這是 n8n 的問題還是工作流程有問題?

錯誤消息是什麼(如果有的話)?

我在 webhook 節點上立即看到一條錯誤消息:在工作流程中發現未使用的回應至 Webhook 節點。

請分享您的工作流程

分享最後一個節點返回的輸出

無崩潰

有關您的 n8n 設置的信息

  • n8n 版本: 2.23.1
  • 數據庫(預設:SQLite):可能是預設的,我沒有配置任何東西
  • n8n EXECUTIONS_PROCESS 設置(預設:own、main):
  • 透過以下方式運行 n8n(Docker、npm、n8n cloud、桌面應用):Docker
  • 操作系統:Linux(或 WSL 更準確地說)

嗨 @JammasterCap 歡迎!

你的問題不是由 Wait 節點引起的,而是由 Webhook 回應配置引起的。

「Respond to Webhook」節點只有在 Webhook 觸發設為「使用 Respond to Webhook 節點回應」時才有效。在你的工作流程中,Webhook 沒有以這種方式配置(它使用立即/預設回應),所以 n8n 正確地標記了「Respond to Webhook」節點為未使用,即使你打算將它用於 Wait 恢復路徑。

修正:要麼將 Webhook 節點回應模式設為「使用 Respond to Webhook 節點」,要麼移除「Respond to Webhook」節點(因為由 Wait 恢復的執行無法回應原始 webhook 請求)。

如果有幫助的話請告訴我 1

感謝您的迅速回答。我知道我的 webhook 已設定為立即回應。「回應到 webhook」節點屬於等待節點。等待節點也可以設定為使用「回應到 webhook」節點進行回應,這就是我在工作流程中所做的。

歡迎加入 n8n 社群 @JammasterCap
我需要你的完整工作流程來確認,我已經做了最小化場景來測試,但無法確認一個錯誤。

歡迎 @JammasterCap!

我完全理解你在這裡想做什麼,使用「回應至 Webhook」作為「等待」恢復的「回調」,而不是初始 webhook,警告讓它看起來好像 n8n 不理解這個模式,儘管流程本身是有效的

在你目前的流程 Webhook → Request2 → Wait → Request → Respond success 中,「回應至 Webhook」節點(「Respond success」)在邏輯上位置錯誤,不符合 n8n 預期的這種模式工作方式。根據文件,「回應至 Webhook」節點只有在屬於明確設定為「使用『回應至 Webhook』節點」的 Webhook 觸發器時才被認為是有效的,而且「回應至 Webhook」必須存在於從該 Webhook 觸發器開始的執行路徑中。

在你的工作流程中,Webhook 觸發器沒有宣告 responseMode: responseNode(它會立即回應),所以它不「擁有」Respond success 節點。相反地,Wait 節點被配置為 responseMode: responseNode,這表示它想要使用「回應至 Webhook」節點來回答恢復 webhook 呼叫(即碰到 $execution.resumeUrl 的那個),而不是原始 Webhook 觸發器請求。

因此,這個工作流程實際上是在嘗試為兩個不同的 HTTP 連線使用同一個「回應至 Webhook」節點:一個用於初始 /webhook/bug_minimal 呼叫,另一個用於 Wait 恢復呼叫,但這些是兩個獨立的請求,無法以驗證器預期的方式共用同一個「回應至 Webhook」。從 n8n 的角度來看,沒有配置「使用『回應至 Webhook』節點」的 Webhook 觸發器與你的 Respond success 節點相符,所以「未使用的『回應至 Webhook』節點」警告不是一個錯誤——它正確地告訴你沒有 Webhook 觸發器實際擁有該「回應至 Webhook」。

與其在最後使用單獨的「回應到 Webhook」節點,不如讓「等待」節點在被呼叫時直接處理 HTTP 回應。
打開你的「等待」節點,
將「回應模式」從「使用回應到 Webhook 節點」改為「收到回應文字(或 Json)時」。
直接在「等待」節點中輸入你的成功回應負載(例如,{“status”: “success”})。
從畫布上刪除「回應成功」節點。
這樣可以保持你的邏輯完全相同,但驗證會完美通過,因為回應完全包含在「等待」節點內。
這應該能解決問題,如果還有進一步的問題,我很樂意幫助。

我很抱歉,我理解你的回應,也明白這不是文件中所述的工作方式,但對我來說,將其視為問題而不是必須接受的現象在邏輯上是非常合理的。

根據文件,「回應至 Webhook」節點只有在屬於明確設定為「使用『回應至 Webhook』節點進行回應」的 Webhook 觸發程式時,才被認為有效

如果這個陳述為真,就沒有理由讓等待節點擁有使用 RWH 回應的選項,因為這立即違反了你陳述中的規則。這意味著要麼文件和 RWH 驗證是錯誤的,要麼等待節點的 RWH 選項是錯誤的。

將回應模式從「使用回應至 Webhook 節點」改為「收到回應文本時」(或 Json)。
直接在等待節點中輸入你的成功回應內容(例如,{“status”: “success”})。
從畫布中刪除成功回應節點。
這樣可以保持你的邏輯完全相同,但驗證會完美通過,因為回應完全包含在等待節點內。

這個解決方案不會保持邏輯相同。在我實際的工作流程中,我將在等待節點中接收到的主體使用 REST 發送給驗證器,執行 If 語句,我甚至可能在資料庫中保存內容。我想只在所有這些事情都成功完成時才回應 200。如果我將等待節點改為始終回應 200,即使例如驗證失敗,工作流程也會始終給我成功的回應。

這就是為什麼我認為我所描述的方式是預期的方式:

  • Webhook 節點和等待節點都有使用回應至 Webhook 節點進行回應的選項(我將其稱為 RWH,因為這個名字太冗長)。從邏輯上講,除了 Webhook 必須用來啟動工作流程這一事實外,它們之間沒有太大差異。
  • 任何時刻,只有一個等待/Webhook 處於活動狀態,等待請求,這意味著在邏輯上沒有歧義來確定 RWH 回應的是哪個等待/Webhook 節點。
  • 這是一個絕對必要的功能,能夠在工作流程中接收請求,執行一些操作,然後根據這些操作的結果正面或負面地進行回應

在我看來,n8n 應該執行適當的圖形分析來找到孤立的 RWH。

此外,如果我通過將 Webhook 改為使用不必要的 RWH 進行回應來騙過驗證讓我的工作流程運行(不必要是因為它也可以立即回應),返回 200,工作流程的行為完全如我所描述的那樣。下面你可以看到工作流程的修改版本,我首先正常啟動它,然後將包含單個布林屬性 stuff 的 JSON 主體發送到等待節點。當 stuff 為真時,會發出 GET 請求,然後我使用我從 GET 請求收到的狀態碼進行回應(見 RWH 節點的程式碼)。如果 stuff 為假,觸發我等待節點的請求將收到 400 作為回應

這個技巧可能就是我從現在開始將使用的方法(在寫這篇文章時我不知道它),但事實仍然存在,這裡有一個明確的問題。

@JammasterCap 通過添加一個虛擬 Webhook → RWH 並將其設置為「立即響應」來繞過驗證器,你已經確認了這是一個驗證器錯誤,而不是使用錯誤。驗證器只是在檢查所有權,並詢問「這個 RWH 是否屬於一個 responseMode 為 responseNode 的 Webhook?」,而不是執行適當的圖形遍歷,這樣驗證器才能識別具有相同配置的 Wait 節點。如果你還沒有這樣做,可以在 GitHub 上提交一個問題:Issues · n8n-io/n8n · GitHub