N8n 工作流設計:將 WhatsApp 位置路由至叫車、食物外送和特殊收集服務

大家好,
我正在 n8n 中建立一個 WhatsApp 工作流程,用於處理來自同一傳入位置訊息的多項服務:

  • :taxi: 乘車預訂(上車點和下車點)
  • :hamburger: 食物外送
  • :package: 特殊收集
    我的挑戰是在查詢 Google Sheets 以獲取活躍乘車、訂單或收集時,保留原始 WhatsApp 位置(「latitude」/「longitude」)。在執行「查找活躍乘車」或「查找活躍訂單」等節點後,Google Sheets 的輸出會取代原始 webhook 裝載,因此當工作流程到達正確的服務分支時,原始位置坐標已不再可用。
    我正在尋找最具可擴展性的架構,用於將單一位置訊息路由至多項服務,同時保留原始裝載。你會使用合併節點、程式碼節點、執行工作流程、資料存儲或其他設計模式嗎?
    任何來自經驗豐富的 n8n 開發者的建議將不勝感激。謝謝!

描述問題/錯誤/問題

錯誤訊息是什麼(如有)?

請分享你的工作流程

(在你的畫布上選取節點,並使用鍵盤快速鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 來複製和貼上工作流程。)

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

有關你的 n8n 設定的資訊

  • n8n 版本:
  • 資料庫(預設值:SQLite):
  • n8n EXECUTIONS_PROCESS 設定(預設值:own、main):
  • 透過以下方式執行 n8n(Docker、npm、n8n cloud、桌面應用程式):
  • 作業系統:

@Thabang_Makalela

由於您正在處理三個不同的服務(Ride、Food、Collection),將所有邏輯放在一個工作流程中最終會導致「義大利麵式」畫布。最具可擴展性的架構是 Router → Service 模式。

架構:

  • 主路由器工作流程:

    1. 接收 WhatsApp Webhook。
    2. 驗證位置。
    3. 使用 Switch Node 來判斷服務(Ride vs. Food vs. Collection)。
    4. 使用 Execute Workflow Node 來呼叫特定的子工作流程(例如 Service_Ride_Booking)。
    5. 關鍵: 將整個 json 負載作為輸入傳遞給子工作流程。
  • 服務子工作流程:

    • 每個子工作流程都以 Execute Workflow Trigger 開始。
    • 它接收位置、執行 Google Sheets 查詢,並處理業務邏輯。
    • 由於位置作為初始輸入傳遞,它在子流程開始時始終可用。
3 個讚

很好的想法,關於 Router → Service 的分割可以長期保持可維護性。對於想要先用更簡單設置的人,有一點值得補充:即使在單一平面工作流程中(沒有 Execute Workflow 分割),你實際上不需要 Merge 或 Code 節點來轉發位置資訊。

n8n 會在整個執行過程中保持每個節點的輸出可訪問,而不僅僅是給定時刻「目前項目」的樣子。所以在下游 - 包括每個 Switch 分支內部 - 你可以直接引用原始觸發節點,而不是目前項目:

{{ $('WhatsApp Trigger').item.json.location.latitude }}
{{ $('WhatsApp Trigger').item.json.location.longitude }}

(將名稱替換為你的實際觸發節點)。只要你沿途保持正常的一對一項目配對,這在 Find Active Ride / Find Active Order 覆寫目前項目後仍然能正確解析(避免建立全新項目的 Code 節點沒有 pairedItem,避免會破壞血統的 Merge 節點)。

所以:單一工作流程 + $('WhatsApp Trigger') 引用能解決「payload 被覆寫」問題,無需任何額外的路由。當分支變得複雜到想要獨立、可獨立測試的子工作流程時,上面的 Router → Service 分割仍然是更好的選擇。

3 個讚

一個好的做法是在將工作流程發送到特定服務節點之前,保留原始 webhook 數據。在 n8n 中,使用 Set 節點存儲位置字段,或使用 Merge 節點稍後將原始負載與 Google Sheets 結果結合,可以幫助保留緯度和經度值。使用清晰的數據處理為每個服務分支結構化也會使工作流程更容易擴展和調試。對於計劃食品相關服務的團隊,我還找到了一個關於 Olive Garden :spaghetti: 菜單選項的有用資源,可能會提供一些靈感。

對 $(‘WhatsApp Trigger’) 方法的一個小但重要的調整:在這裡使用 .first() 而不是 .item。

.item 透過項目配對來解析,當你的 Sheets 查詢傳回的項目數與觸發器傳回的項目數不同時,該配對就會中斷——你會得到錯誤行的座標或「無法判斷要使用哪個項目」的錯誤,通常在你新增分支時才會出現,而不是現在。WhatsApp webhook 是每次執行一條訊息,所以 $(‘WhatsApp Trigger’).first().json.location.latitude 是明確的,無論分支做什麼都能保持正確。