n8n Thai
by n8n Thai

Code Node ใน n8n: เขียน JavaScript เสริมพลัง Workflow

คู่มือใช้งาน Code Node ใน n8n เขียน JavaScript แปลงข้อมูล คำนวณ Logic ซับซ้อน และเรียก async function ที่ Node มาตรฐานทำไม่ได้

Code Node ใน n8n: เขียน JavaScript เสริมพลัง Workflow

n8n มี Node มาตรฐานให้ใช้หลายร้อยตัว แต่ในโลกจริงเสมอมีงานที่ไม่มี Node สำเร็จรูปรองรับ — แปลง date format แบบพิเศษ, คำนวณส่วนลดตามเงื่อนไขซับซ้อน, หรือ flatten nested object ที่มีโครงสร้างซ้ำกันไม่แน่นอน

Code Node คือทางออก เป็น Node ที่ให้คุณเขียน JavaScript ได้เลย มีพลังเต็ม แต่ก็ต้องใช้ด้วยความระมัดระวัง

Code Node คืออะไร

Code Node รัน JavaScript ใน Node.js environment บน n8n instance ของคุณ รองรับทั้ง:

  • JavaScript ES2020+ syntax ทั้งหมด
  • async/await
  • Built-in Node.js modules บางส่วน (เช่น crypto, Buffer)
  • n8n helper functions และ $input API

สิ่งที่ทำ _ไม่_ได้:

  • Import npm packages โดยตรง (ต้องใช้ Community Nodes หรือ Docker layer)
  • เข้าถึง File System โดยตรง (เพื่อความปลอดภัย)
  • เรียก external HTTP Request ตรงๆ (ใช้ HTTP Request Node แทน)

โครงสร้างพื้นฐาน

Code Node มีสองโหมด:

Run Once for All Items — รับ Items ทั้งหมดเข้ามาเป็น Array ใช้เมื่อต้องการทำงานกับ Items ทั้งหมดพร้อมกัน เช่น คำนวณ aggregate, sort, หรือ group

// Run Once for All Items
const items = $input.all();

// เรียงลำดับตามราคา
const sorted = items.sort((a, b) => 
  a.json.price - b.json.price
);

return sorted;

Run Once for Each Item — รัน 1 ครั้งต่อ 1 Item ใช้เมื่อต้องการแปลงแต่ละ Item อิสระจากกัน

// Run Once for Each Item
const item = $input.item.json;

// แปลง date format
const date = new Date(item.created_at);
const thaiDate = `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear() + 543}`;

return {
  ...item,
  created_at_thai: thaiDate
};

$input API

Code Node เข้าถึงข้อมูล Input ผ่าน $input:

$input.all()        // ได้ Array ของทุก Item: [{ json: {...}, ... }]
$input.first()      // ได้ Item แรก
$input.last()       // ได้ Item สุดท้าย
$input.item         // ได้ Item ปัจจุบัน (เฉพาะ Run Once for Each Item)

แต่ละ Item มีโครงสร้าง:

{
  json: { /* ข้อมูลหลัก */ },
  binary: { /* ไฟล์ binary ถ้ามี */ },
  pairedItem: { /* reference กลับไปยัง Input Item */ }
}

เข้าถึงข้อมูลจาก Node อื่น

นอกจาก $input ยังเข้าถึงข้อมูลจาก Node ก่อนหน้าในชื่อได้ผ่าน $():

// ดึงข้อมูลจาก Node ชื่อ "Get Customer"
const customer = $('Get Customer').first().json;

// ดึง Items ทั้งหมดจาก Node ชื่อ "List Orders"
const orders = $('List Orders').all();

// เข้าถึง environment variable
const apiKey = $env.MY_API_KEY;

Use Cases ที่พบบ่อย

1. Transform และ Reshape ข้อมูล

// Run Once for All Items
const items = $input.all();

return items.map(item => ({
  json: {
    id: item.json.order_id,
    customer: `${item.json.first_name} ${item.json.last_name}`,
    total: item.json.subtotal + item.json.shipping_fee,
    status: item.json.status === 'completed' ? 'สำเร็จ' : 'รอดำเนินการ'
  }
}));

2. Filter ด้วยเงื่อนไขซับซ้อน

// Run Once for All Items
const items = $input.all();

// กรองเฉพาะ order ที่: ยอดมากกว่า 500 บาท AND สถานะ pending AND ไม่เกิน 7 วัน
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);

return items.filter(item => {
  const order = item.json;
  const orderDate = new Date(order.created_at);
  return order.total > 500 
    && order.status === 'pending' 
    && orderDate > sevenDaysAgo;
});

3. Aggregate และ Group By

// Run Once for All Items
const items = $input.all();

// รวมยอดขายแยกตามสินค้า
const summary = {};
for (const item of items) {
  const { product_name, quantity, unit_price } = item.json;
  if (!summary[product_name]) {
    summary[product_name] = { quantity: 0, revenue: 0 };
  }
  summary[product_name].quantity += quantity;
  summary[product_name].revenue += quantity * unit_price;
}

// แปลงกลับเป็น Array
return Object.entries(summary).map(([name, data]) => ({
  json: { product_name: name, ...data }
}));

4. คำนวณวันที่แบบซับซ้อน

// Run Once for Each Item
const item = $input.item.json;

const orderDate = new Date(item.created_at);
const dueDate = new Date(orderDate);
dueDate.setDate(dueDate.getDate() + 30);

const today = new Date();
const daysRemaining = Math.ceil((dueDate - today) / (1000 * 60 * 60 * 24));

return {
  ...item,
  due_date: dueDate.toISOString().split('T')[0],
  days_remaining: daysRemaining,
  is_overdue: daysRemaining < 0
};

5. Hash และ Encode/Decode

// Run Once for Each Item
const crypto = require('crypto');
const item = $input.item.json;

// สร้าง HMAC signature สำหรับ API
const secret = $env.WEBHOOK_SECRET;
const payload = JSON.stringify(item);
const signature = crypto
  .createHmac('sha256', secret)
  .update(payload)
  .digest('hex');

return {
  ...item,
  signature: `sha256=${signature}`
};

Error Handling ใน Code Node

ใช้ try/catch เพื่อจัดการ Error ภายใน Code Node:

// Run Once for Each Item
try {
  const item = $input.item.json;
  
  // Logic ที่อาจเกิด error
  const parsed = JSON.parse(item.raw_data);
  
  return {
    ...item,
    parsed_data: parsed,
    parse_error: null
  };
} catch (error) {
  // ส่ง error กลับแทนการ throw เพื่อให้ Workflow ทำงานต่อได้
  return {
    ...$input.item.json,
    parsed_data: null,
    parse_error: error.message
  };
}

Async Code

Code Node รองรับ async/await สำหรับ operation ที่ต้องรอ แต่ในทางปฏิบัติ ควรหลีกเลี่ยงการเรียก HTTP Request ใน Code Node แล้วใช้ HTTP Request Node แทน เพราะมี Error Handling และ Retry ที่ดีกว่า

กรณีที่ async มีประโยชน์จริงๆ คือ operation ที่ต้องรอการคำนวณ เช่น การ hash ไฟล์ขนาดใหญ่:

// Run Once for All Items
const items = $input.all();

const processed = await Promise.all(
  items.map(async (item) => {
    // simulate async operation
    const result = await someAsyncTransform(item.json);
    return { json: result };
  })
);

return processed;

เมื่อไหรควรใช้ Code Node vs Set Node

งานแนะนำ
เปลี่ยนชื่อ field ธรรมดาSet Node
คำนวณง่ายๆSet Node + Expression
แปลงข้อมูลซับซ้อนCode Node
Filter ด้วยเงื่อนไขซับซ้อนCode Node
Aggregate/Group ByCode Node
Regex transformCode Node
Crypto/HashCode Node

Code Node ทรงพลัง แต่ควรใช้เมื่อจำเป็นจริงๆ Workflow ที่ใช้ Node มาตรฐานมักอ่านง่ายและบำรุงรักษาง่ายกว่า ให้ Code Node เป็นเครื่องมือสำรองสำหรับงานที่ Node ธรรมดาไม่รองรับ

อยากเรียน n8n แบบเป็นระบบ ตั้งแต่เริ่มต้นจนสร้าง Workflow ใช้งานจริงได้ ลองดู คอร์สสอน n8n ที่ aiunlock.co

Related posts