嗨 @Thabang_Makalela
由於您正在處理三個不同的服務(Ride、Food、Collection),將所有邏輯放在一個工作流程中最終會導致「義大利麵式」畫布。最具可擴展性的架構是 Router → Service 模式。
架構:
-
主路由器工作流程:
- 接收 WhatsApp Webhook。
- 驗證位置。
- 使用 Switch Node 來判斷服務(Ride vs. Food vs. Collection)。
- 使用 Execute Workflow Node 來呼叫特定的子工作流程(例如
Service_Ride_Booking)。
- 關鍵: 將整個
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
菜單選項的有用資源,可能會提供一些靈感。
對 $(‘WhatsApp Trigger’) 方法的一個小但重要的調整:在這裡使用 .first() 而不是 .item。
.item 透過項目配對來解析,當你的 Sheets 查詢傳回的項目數與觸發器傳回的項目數不同時,該配對就會中斷——你會得到錯誤行的座標或「無法判斷要使用哪個項目」的錯誤,通常在你新增分支時才會出現,而不是現在。WhatsApp webhook 是每次執行一條訊息,所以 $(‘WhatsApp Trigger’).first().json.location.latitude 是明確的,無論分支做什麼都能保持正確。