Code Node ใน n8n: เขียน JavaScript เสริมพลัง Workflow
คู่มือใช้งาน Code Node ใน n8n เขียน JavaScript แปลงข้อมูล คำนวณ Logic ซับซ้อน และเรียก async function ที่ Node มาตรฐานทำไม่ได้
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 และ
$inputAPI
สิ่งที่ทำ _ไม่_ได้:
- 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 By | Code Node |
| Regex transform | Code Node |
| Crypto/Hash | Code Node |
Code Node ทรงพลัง แต่ควรใช้เมื่อจำเป็นจริงๆ Workflow ที่ใช้ Node มาตรฐานมักอ่านง่ายและบำรุงรักษาง่ายกว่า ให้ Code Node เป็นเครื่องมือสำรองสำหรับงานที่ Node ธรรมดาไม่รองรับ
อยากเรียน n8n แบบเป็นระบบ ตั้งแต่เริ่มต้นจนสร้าง Workflow ใช้งานจริงได้ ลองดู คอร์สสอน n8n ที่ aiunlock.co
Related posts
n8n Advanced: 10 เทคนิคขั้นสูงสำหรับมืออาชีพ
รวม 10 เทคนิค n8n ขั้นสูงที่มืออาชีพใช้จริง ตั้งแต่ Error Handling, Sub-Workflow, Code Node ไปจนถึง API Pagination
n8n Expressions: สูตรและตัวแปรที่ใช้บ่อย
รวม n8n Expressions ที่ใช้บ่อยที่สุด ทั้ง $json, $item, $now, $workflow พร้อมตัวอย่างจริงที่คัดลอกไปใช้ได้เลย
Loop และ Batch Processing ใน n8n
เรียนรู้วิธีใช้ Loop Node และ SplitInBatches ใน n8n เพื่อประมวลผลข้อมูลหลายรายการอย่างมีประสิทธิภาพโดยไม่ติด Rate Limit