Skip to content
⚙️自動化#046進階金字塔 · 做
工程師n8nClaude.aiCodex#n8n#JavaScript#資料轉換

n8n Code 節點:JavaScript 資料轉換

用途

在 n8n Code 節點寫出符合規範的 JavaScript,正確處理多筆資料並回傳合法格式,避免常見的格式錯誤導致下游節點斷掉。

何時用

  • 適合:Set 節點或 Function 節點不夠用、需要自訂篩選 / 聚合 / 合併邏輯時;要從 Webhook payload 取多層欄位並重新塑形時。
  • 不要用:只是選架構或設計節點清單,請用「架構模式選擇器」;如果邏輯很簡單(只是改一個欄位名稱),用 Set 節點就夠,不需要 Code 節點增加維護成本。

Prompt

text
我要在 n8n Code 節點寫 JavaScript 資料轉換,請幫我產出完整可貼入的程式碼。

輸入資料(JSON 範例):
{{輸入資料JSON——貼一筆真實資料讓 AI 知道欄位結構}}

要做的轉換:
{{要做的轉換——描述篩選條件、聚合方式、欄位對應等}}

期望輸出(JSON 範例或描述):
{{期望輸出}}

要求:
1. 回傳格式必須是 [{json: {...}}] 陣列(n8n Code 節點規範)
2. Webhook 來的資料要從 $json.body 取,不是 $json
3. 使用 "Run Once for All Items" 模式(items 傳入,return 陣列)
4. 對所有可能 null/undefined 的欄位加防禦性檢查
5. 整個邏輯包在 try-catch,catch 回傳 [{json: {error: e.message, input: items}}]
6. 不要用 require()(n8n 沙盒不支援)

輸出:完整 JS 程式碼 + 3 行說明每個主要步驟在做什麼。

範例 / 變體

  • 填好變數:輸入貼一筆 Webhook payload {"body": {"orders": [{"id": "001", "amount": 500}]}}},轉換描述「篩選 amount > 100 的訂單,回傳 id + amount + 稅額(amount*0.05)」,輸出 [{json: {id, amount, tax}}]
  • 變體(聚合版):多筆 items 進來、要聚合成一筆(如加總金額),在需求描述加「多筆 items 聚合成一筆輸出」,AI 會用 items.reduce() 寫法。
  • 變體(含 console.log 除錯版):在要求中加「每個主要步驟加 console.log,方便在 n8n 執行日誌中追蹤」,開發階段用。

🎯 範例輸出(實測)

Claude.ai 跑這句、把 {{變數}} 填成「輸入:{"body":{"orders":[{"id":"001","amount":500},{"id":"002","amount":80}]}};轉換:篩選 amount > 100 的訂單,回傳 id + amount + 稅額(amount*0.05);輸出:[{json:{id,amount,tax}}]」的結果:

點開看 AI 實際輸出
text
// n8n Code Node — Run Once for All Items
// 步驟說明:
// 1. 從 Webhook body 取 orders 陣列(防禦性取值)
// 2. 篩選 amount > 100 的訂單,計算稅額
// 3. 回傳 n8n 規範的 [{json: {...}}] 格式

try {
  // Step 1: 取 Webhook body(注意是 $json.body,不是 $json)
  const orders = items[0]?.json?.body?.orders;

  if (!orders || !Array.isArray(orders)) {
    return [{ json: { error: "orders 欄位不存在或非陣列", input: items } }];
  }

  // Step 2: 篩選 + 計算
  const filtered = orders
    .filter(order => order?.amount != null && order.amount > 100)
    .map(order => ({
      id: order.id ?? null,
      amount: order.amount,
      tax: Math.round(order.amount * 0.05 * 100) / 100
    }));

  // Step 3: 回傳 n8n 格式(每筆包 {json: ...})
  return filtered.map(item => ({ json: item }));

} catch (e) {
  return [{ json: { error: e.message, input: items } }];
}

輸出結果(測試資料):

text
[
  { "json": { "id": "001", "amount": 500, "tax": 25 } }
]
// 訂單 002(amount:80)被篩掉,訂單 001 通過,稅額 = 500 * 0.05 = 25

💡 實測心得:把輸入 JSON 的真實結構貼給 AI 是這個 prompt 最關鍵的步驟——貼假資料會讓 AI 猜欄位名,實際跑起來大機率取到 undefined;先在 n8n 裡用 Test Workflow 執行一次,把真實 payload 複製出來再餵給 Claude,一次到位。

延伸

簡單來說,n8n Code 節點最常踩的三個坑:回傳格式少了外層 {json: ...} 包裝、從 Webhook 取資料少了 .body、沒做 null 檢查讓下游節點炸掉。這個 prompt 的六條要求就是為了把這三個坑封住。

如果你的 JS 寫好後行為還是不對,用「n8n 工作流程除錯診斷」提示語做系統性排查。

依場景分類 · 一鍵複製 · 持續擴充