n8n Code 節點終極教學:釋放 JavaScript 的力量,打造無極限自動化

n8n code node javascript

你是否曾經在使用 n8n 時遇到這樣的瓶頸:你想實現一個獨特的商業邏輯,或處理一個極度複雜的資料結構,卻發現內建的節點功能再怎麼組合,都無法完美達成你的需求?你感覺自己被困在了視覺化介面的框架裡,渴望一把能夠打破限制、通往無限可能的鑰匙。

這把鑰匙,就是 n8nCode 節點

Code 節點是 n8n 工作流中的「超級武器」,它就像一個隱藏的後門,讓你跳脫所有預設節點的限制,直接在工作流中撰寫並執行 JavaScript 程式碼。這意味著,任何你可以用 JavaScript 做到的事,你都可以在 n8n 裡實現。

對於不懂程式的人來說,Code 節點聽起來可能有點嚇人,但請別擔心。這篇文章將會是你最完整的 n8n Code 節點實戰指南,我們會從「為什麼需要它」開始,手把手帶你認識它的基本語法,並提供三個超實用的實戰範例,讓你即使不是程式高手,也能學會如何運用 Code 節點,將你的自動化工作流提升到一個全新的維度。

為什麼你需要 Code 節點?三大使用時機解析

在 n8n 數百個功能強大的標準節點中,為什麼我們還需要一個看似複雜的 Code 節點?答案是:當你需要極致的彈性客製化時。以下是三個最典型的使用時機:

1. 進行複雜的資料處理與轉換

雖然 SetMerge 節點可以處理基本的資料新增與合併,但當你的需求變得複雜時,它們就顯得力不從心。例如:

  • 動態計算: 你需要根據多個欄位的值,透過一個複雜的公式計算出最終結果,可能還包含條件判斷。
  • 結構重塑: API 回傳了一個深層巢狀的 JSON 物件,而你只想從中提取特定資訊,組合成一個全新的、扁平化的資料結構。
  • 迴圈處理: 你需要對單一資料項目 (Item) 裡的陣列 (Array) 進行迴圈處理,這是標準節點難以做到的。

2. 執行標準節點沒有的獨特邏輯

有時候,你的商業邏輯非常獨特,n8n 中找不到現成的節點可以完美匹配。例如:

  • 產生亂數或唯一 ID: 你需要為每筆資料產生一組不重複的優惠券代碼或訂單編號。
  • 客製化資料驗證: 你需要根據一套非常嚴格的規則(例如身分證字號驗證演算法)來檢查傳入的資料是否合法。
  • 文字處理: 你需要對一段文字進行複雜的處理,如移除特定符號、計算字數、或轉換大小寫。

3. 串接沒有專屬節點的 API 服務

n8n 的 HTTP Request 節點已經非常強大,但有些 API 的串接方式比較特殊。例如:

  • 複雜的認證機制: 在發送請求前,你需要根據時間戳和密鑰(Secret Key)動態生成一個簽章 (Signature)。
  • 特殊資料格式: API 要求你發送的資料是 XML 格式,或回傳的資料需要經過特殊解碼。
  • 整合請求與處理: 你想在一個節點內完成「發送請求 -> 判斷回應 -> 處理回應資料」的完整邏輯,而不是分散在多個節點。

當你遇到以上這些情況時,就是 Code 節點大顯身手的最佳時機。

Code 節點快速上手:基礎介面與資料存取

別害怕,Code 節點的基礎比你想像的簡單。你只需要掌握兩個核心概念:如何「讀取」傳入的資料,以及如何「回傳」處理完的資料。

認識執行環境:讀懂 items 輸入變數

當資料流進 Code 節點時,所有從上一個節點傳來的資料都會被打包成一個名為 items 的陣列 (Array) 變數,你可以在程式碼中直接取用。

這個 items 變數的結構非常固定,長得像這樣: [ { json: { ... } }, { json: { ... } }, ... ]

  • items 是一個陣列,包含了所有傳入的資料項目 (Items)。
  • 陣列中的每一個元素都是一個物件,代表一個 Item。
  • 你真正關心的資料,都存放在 json 這個 key 裡面。

所以,如果要存取第一個 Item 的資料,你會用 items[0].json。如果要存取它的 name 欄位,就是 items[0].json.name

撰寫你的第一行 Code:修改資料欄位

最常見的任務就是遍歷 (Loop) 所有傳入的 items,然後對每一筆資料進行加工。

JavaScript

// items 是一個陣列,包含了所有從上一個節點傳來的資料
// 我們可以使用 for...of 迴圈來逐一處理每一筆 item

for (const item of items) {
  // 在每個 item 的 json 物件中,新增一個名為 "status" 的欄位
  // 並給它一個固定的值 "processed"
  item.json.status = "processed";

  // 你也可以讀取現有欄位的值,並進行修改
  // 例如,將 "name" 欄位的值轉換成大寫
  if (item.json.name) { // 最好先檢查欄位是否存在
    item.json.name = item.json.name.toUpperCase();
  }
}

// 最後,記得要把處理完的 items 陣列回傳出去
// 這樣下一個節點才能接收到你處理完的資料
return items;

回傳資料:return 的重要性

這是 Code 節點的黃金法則:你的程式碼最後「必須」回傳一個符合 n8n 格式的陣列,也就是 [ { json: { ... } } ] 的形式。

  • 如果你處理完資料後忘記 return items;,下一個節點將收不到任何資料,工作流就會在此中斷。
  • 如果你想篩選資料,你可以建立一個新的空陣列,只把符合條件的 item 加進去,最後回傳這個新的陣列。
  • 如果你想產生全新的資料,那就要自己手動建立一個符合格式的新陣列並回傳它。
n8n code node javascript

實戰範例一:批次處理資料與複雜計算

目標: 我們有一批產品資料,包含 price (價格) 和 discount (折扣,是 0 到 1 之間的小數)。我們需要計算出每個產品的 final_price (最終售價),公式為 價格 * (1 - 折扣),並且將結果四捨五入到整數。

JavaScript

// 假設傳入的 items 結構為:
// [{ json: { product_name: "商品A", price: 1999, discount: 0.15 } }, ... ]

for (const item of items) {
  // 進行數學計算
  const originalPrice = item.json.price;
  const discountRate = item.json.discount;
  
  // 計算折扣後價格
  const discountedPrice = originalPrice * (1 - discountRate);
  
  // 使用 Math.round() 進行四捨五入
  const finalPrice = Math.round(discountedPrice);
  
  // 將計算結果存入一個新的欄位 final_price
  item.json.final_price = finalPrice;
}

return items;

實戰範例二:重塑 (Reshape) 複雜的 JSON 結構

目標: 從一個巢狀的 API 回應中,只提取出 user 物件裡的 nameemail,以及 order 陣列中的第一筆訂單的 order_id,組合成一個全新的、扁平的資料結構。

輸入資料 (Input Data) 範例:

JSON

[{
  "json": {
    "status": "success",
    "data": {
      "user": {
        "id": "u-123",
        "name": "陳先生",
        "email": "chen@example.com"
      },
      "orders": [
        { "order_id": "ord-abc", "amount": 1500 },
        { "order_id": "ord-def", "amount": 800 }
      ]
    }
  }
}]

Code 節點程式碼:

JavaScript

// 建立一個新的空陣列來存放我們的結果
const newItems = [];

for (const item of items) {
  // 提取需要的資料
  const userName = item.json.data.user.name;
  const userEmail = item.json.data.user.email;
  // 取得訂單陣列中的第一個訂單ID,如果沒有訂單則給定預設值
  const firstOrderId = item.json.data.orders.length > 0 ? item.json.data.orders[0].order_id : 'N/A';
  
  // 建立一個全新的、扁平化的 json 物件
  const newJson = {
    customer_name: userName,
    contact_email: userEmail,
    latest_order_id: firstOrderId
  };
  
  // 將這個新物件包裝成 n8n 的 item 格式,並推入新陣列
  newItems.push({ json: newJson });
}

// 回傳這個全新的陣列
return newItems;

輸出資料 (Output Data) 範例:

JSON

[{
  "json": {
    "customer_name": "陳先生",
    "contact_email": "chen@example.com",
    "latest_order_id": "ord-abc"
  }
}]

實戰範例三:產生不重複的隨機優惠券代碼

目標: 為每一筆傳入的客戶資料,都產生一組由 8 位大寫英文字母和數字組成的隨機優惠券代碼。

JavaScript

// 先在迴圈外部定義一個產生隨機字串的函式
function generateCouponCode(length) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

for (const item of items) {
  // 為每一個 item 呼叫函式來產生一組 8 位數的代碼
  const coupon = generateCouponCode(8);
  
  // 將產生的代碼存入名為 coupon_code 的新欄位
  item.json.coupon_code = coupon;
}

return items;
n8n code node javascript

結語

n8n 的 Code 節點無疑是這個工具中最鋒利的一把瑞士刀。它為你的自動化流程打開了一扇通往無限可能的大門,讓你不再受限於任何預設的功能。

雖然它需要一些基礎的 JavaScript 知識,但正如範例所示,你不需要成為一個程式大神也能開始運用它來解決實際問題。很多時候,你需要的只是一個簡單的 for 迴圈和基本的物件操作。

當你下次在規劃 n8n 工作流時,如果腦中閃過「要是這裡可以…就好了」的念頭,不妨停下來,問問自己:「這個問題,是不是可以用 Code 節點來解決?」一旦你跨出了這一步,你會發現整個 n8n 的世界在你面前將變得更加寬廣。

延伸閱讀
n8n IF 節點教學:掌握 True/False 條件判斷,打造更智慧的自動化工作流
n8n Switch 節點教學:告別複雜 IF 巢狀結構,優雅實現多重條件判斷
n8n Merge 節點教學:合併多個資料來源,告別手動複製貼上
n8n Code 節點終極教學:釋放 JavaScript 的力量,打造無極限自動化
n8n Code 節點 Python 教學:啟用並執行 Python 程式碼,釋放數據處理超能力
n8n Wait 節點教學:讓工作流學會「等待」,完美解決 API 限制與定時任務
n8n Set 節點教學:你的資料瑞士刀,新增、修改、篩選欄位一次搞定
n8n NoOp 節點教學:一個「什麼都不做」的節點,為何是整理工作流的神器?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端