Code Node là một trong những node linh hoạt và mạnh mẽ nhất trong n8n. Nó cho phép bạn chèn các đoạn mã tùy chỉnh (JavaScript hoặc Python) trực tiếp vào workflow của mình. Khi các node có sẵn không đáp ứng được nhu cầu xử lý dữ liệu phức tạp, Code Node chính là chìa khóa để bạn tự tạo ra logic riêng.
Về bản chất, Code Node cung cấp cho bạn một "sandbox" (môi trường an toàn) để:
Biến đổi dữ liệu từ các node trước đó.
Thực hiện các tính toán phức tạp.
Gọi các hàm JavaScript/Python thuần túy.
Tích hợp với các thư viện bên ngoài (trong giới hạn cho phép).
Tổng hợp hoặc phân tách dữ liệu một cách linh hoạt.
Phân loại Code Node
n8n cung cấp hai loại Code Node chính:
Code (JavaScript): Sử dụng ngôn ngữ JavaScript/Node.js. Đây là lựa chọn mặc định và phổ biến nhất, với quyền truy cập trực tiếp vào các module của Node.js.
Code (Python): Sử dụng ngôn ngữ Python. Node này chạy code Python thông qua một máy chủ riêng biệt, vì vậy hiệu suất có thể chậm hơn một chút so với JavaScript.
Bài viết này sẽ tập trung chủ yếu vào Code (JavaScript) do tính phổ biến và hiệu năng cao của nó.
Cấu trúc và Cách thức hoạt động của Code Node (JavaScript)
Khi bạn mở một Code Node (JavaScript), bạn sẽ thấy một trình soạn thảo code với cấu trúc cơ bản như sau:
// Dữ liệu từ các node trước được truyền vào biến `$input` // Dòng đầu tiên phải là một comment mô tả dữ liệu đầu vào. // Code ở đây sẽ thực thi cho mỗi item đầu vào. // Bạn có thể trả về một item đơn, một mảng các item, hoặc một object. // Ví dụ: Giả sử đầu vào là một object JSON chứa số tiền và thuế. const amount = $input.first().json.amount; const taxRate = $input.first().json.taxRate; // Thực hiện tính toán const taxAmount = amount * taxRate; const total = amount + taxAmount; // Trả về dữ liệu mới. Bạn PHẢI trả về một giá trị. return { amount: amount, taxRate: taxRate, taxAmount: taxAmount, total: total };
Giải thích các thành phần quan trọng:
$input: Đây là đối tượng chứa tất cả dữ liệu đầu vào từ node trước đó. Nó là mộtArraycủa cácitem.$input.first(): Lấy item đầu tiên trong mảng đầu vào.$input.all(): Trả về tất cả các items dưới dạng một mảng. Hữu ích khi bạn muốn xử lý toàn bộ dữ liệu cùng lúc.$input.item: Chỉ mục của item hiện tại (0, 1, 2,...) khi bạn chọn chế độ "Run Once for All Items"..json: Đây là nơi chứa dữ liệu JSON của item. Hầu hết các thao tác của bạn sẽ được thực hiện trên$input.first().json.someProperty.return: Bạn bắt buộc phải sử dụng lệnhreturnđể trả về dữ liệu cho node tiếp theo. Bạn có thể trả về một object, một mảng, hoặc bất kỳ kiểu dữ liệu nào.
Các Chế độ Thực thi (Execution Mode)
Đây là một tính năng quan trọng quyết định cách code của bạn được chạy:
Run Once for All Items: Toàn bộ code của bạn chỉ chạy một lần duy nhất. Bạn nhận được tất cả các items (
$input.all()) và có thể trả về một hoặc nhiều items. Lý tưởng để tổng hợp, sắp xếp hoặc lọc toàn bộ tập dữ liệu.Run Once for Each Item: Code của bạn sẽ được thực thi lặp lại cho từng item một. Mỗi lần chạy, bạn chỉ xử lý một item (
$input.first()). Đây là chế độ phổ biến nhất.
Ví dụ Minh họa Chi tiết
Ví dụ 1: Làm sạch và Chuẩn hóa Dữ liệu (Run Once for Each Item)
Nhiệm vụ: Nhận dữ liệu từ một API chứa tên người dùng, nhưng tên có thể viết hoa viết thường lộn xộn. Chúng ta muốn chuẩn hóa chúng về dạng "Viết Hoa Chữ Cái Đầu".
// Lấy tên từ item đầu vào const rawName = $input.first().json.name; // Hàm chuẩn hóa tên function standardizeName(name) { return name.toLowerCase() .split(' ') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); } const standardizedName = standardizeName(rawName); // Trả về item mới với tên đã được chuẩn hóa return { ...$input.first().json, // Giữ nguyên tất cả các trường dữ liệu cũ standardizedName: standardizedName // Thêm trường mới };
Ví dụ 2: Gọi một API bên ngoài (Run Once for Each Item)
Nhiệm vụ: Lấy địa chỉ IP từ item đầu vào và gọi API để tra cứu thông tin địa lý.
const ip = $input.first().json.ipAddress; // Sử dụng module `axios` có sẵn của Node.js để gọi API const response = await axios.get(`http://ip-api.com/json/${ip}?fields=status,message,country,city,lat,lon`); // Kiểm tra nếu API call thành công if (response.data.status === 'success') { return { originalIp: ip, country: response.data.country, city: response.data.city, latitude: response.data.lat, longitude: response.data.lon }; } else { // Xử lý lỗi, có thể throw error hoặc trả về thông báo return { error: 'IP lookup failed', message: response.data.message }; }
Ví dụ 3: Tổng hợp và Tính toán (Run Once for All Items)
Nhiệm vụ: Nhận một mảng các đơn hàng, tính tổng doanh thu và số lượng đơn hàng.
// Lấy tất cả các items const allOrders = $input.all(); // Khởi tạo biến tổng let totalRevenue = 0; let orderCount = allOrders.length; // Duyệt qua từng đơn hàng để tính tổng doanh thu allOrders.forEach(order => { totalRevenue += order.json.amount; }); // Trả về một item DUY NHẤT chứa thông tin tổng hợp return { summary: { totalRevenue: totalRevenue, orderCount: orderCount, averageOrderValue: totalRevenue / orderCount } };
Sử dụng Biến Môi trường & Thông tin Xác thực
Bạn có thể truy cập các biến môi trường và thông tin xác thực đã được lưu trữ trong n8n một cách dễ dàng.
// Lấy biến môi trường const apiKey = process.env.MY_SECRET_API_KEY; // Lấy thông tin xác thực (ví dụ: kiểu 'httpHeaderAuth') const credentials = await this.getCredentials('httpHeaderAuth'); const authHeader = credentials.name; // Truy cập vào các trường của credential
Mẹo và Lưu ý Quan trọng
Luôn có
return: Quênreturnlà lỗi phổ biến nhất. Node sẽ không có dữ liệu đầu ra.Hiểu rõ chế độ thực thi: Chọn sai chế độ ("Run Once for All Items" vs. "Run Once for Each Item") sẽ dẫn đến kết quả không mong muốn.
Xử lý lỗi: Sử dụng
try...catchđể xử lý lỗi tiềm ẩn (như gọi API thất bại).try { // Code có thể gây lỗi } catch (error) { // Xử lý lỗi, ví dụ trả về một object thông báo lỗi return { error: error.message }; }
Sử dụng
console.logđể Debug: Bạn có thể sử dụngconsole.log()và kiểm tra kết quả trong Execution View của n8n. Đây là công cụ debug cực kỳ hữu ích.Hiệu năng: Với các tác vụ đơn giản (như nối chuỗi, ánh xạ trường dữ liệu), hãy ưu tiên sử dụng Expression trong Set node thay vì Code Node để workflow nhẹ nhàng và nhanh hơn.
Đối với Python: Cú pháp khác nhưng nguyên tắc tương tự. Lưu ý rằng bạn cần cài đặt và chạy máy chủ Python riêng biệt để sử dụng node này.
Kết luận
Code Node là "cánh tay phải" không thể thiếu cho bất kỳ ai muốn khai thác sức mạnh tối đa của n8n. Nó phá vỡ mọi giới hạn, biến n8n từ một công cụ kết nối các dịch vụ có sẵn thành một nền tảng tự động hóa linh hoạt, có thể lập trình được. Bằng cách làm chủ Code Node, bạn có thể giải quyết hầu hết mọi bài toán xử lý dữ liệu phức tạp trong quy trình làm việc của mình.
Hãy bắt đầu với những ví dụ đơn giản và dần dần thử nghiệm với các logic phức tạp hơn. Chúc bạn thành công!
.jpg)
.jpg)
Nhận xét
Đăng nhận xét