在 n8n 中使用動態 JSON 映射處理間歇性的 webhook payload 格式化問題

大家好,

我在自動化工作流程中遇到了一些邏輯瓶頸,想看看其他人如何處理雜亂的傳入 webhook 資料。

情景: 我有一個外部服務通過 webhook 傳送資料來觸發 n8n 工作流程。但是,傳入的 JSON 承載結構偶爾會根據事件類型而改變——有時鍵是巢狀的,有時則以扁平陣列的形式返回。

我已嘗試的方法: 我目前使用標準 IF 節點和運行 JavaScript 的 Code 節點來檢查鍵的存在,然後將其對應到後續的 HTTP Request 節點。但當架構變化意外發生時,它會導致下游執行錯誤。

有人在 n8n 內建立過一個乾淨、有彈性的模式來規範化波動的 webhook 架構,然後再將資料傳遞到下游應用程式嗎?你是否使用特定的錯誤處理子工作流程或進階表達式解析?

感謝你能分享任何見解或最佳實踐!

@Maaz 歡迎!
具有復原力的模式是停止對原始酬載進行分支處理,而是在 Webhook 之後的單個 Code 節點中一次性將其標準化為固定架構,讓所有下游節點都能依賴。在那裡強制轉換形狀並防禦性地讀取鍵,以便架構轉變只會影響那一個節點,而不會破壞 HTTP Request 節點:

const p = $json.body ?? $json;
const rows = Array.isArray(p) ? p : (Array.isArray(p.items) ? p.items : [p]);

return rows.map(r => ({
  json: {
    id:    r.id    ?? r.data?.id ?? null,
    email: r.email ?? r.data?.customer?.email ?? null,
    type:  r.event ?? r.type ?? 'unknown',
    raw:   r,
  }
}));

?. 和 ?? 是帶來復原力的關鍵:它們讀取嵌套或缺失的鍵而不會拋出異常,因此移動或缺失的欄位會變成 null 而不是硬錯誤。從那裡,使用 Switch 節點而不是鏈式 IF 對標準化的類型進行路由(每個分支仍然輸出相同的欄位),在 HTTP Request 節點上將 On Error 設定為 Continue(使用錯誤輸出),以便一個有問題的項目進入錯誤分支而不是停止執行,並在 Options > Settings 下將工作流指向專用的 Error Trigger 工作流,以便任何仍然漏掉的東西都能被捕獲和警報。