Trong n8n, Loop Node (Node Vòng lặp) là một loại node đặc biệt và cực kỳ mạnh mẽ cho phép bạn thực hiện lặp lại một phần của workflow dựa trên dữ liệu đầu vào. Thay vì phải tạo ra nhiều workflow giống nhau hoặc xử lý thủ công, Loop Node giúp tự động hóa việc lặp đi lặp lại các thao tác một cách hiệu quả.
Về bản chất, Loop Node sẽ:
Nhận một mảng (danh sách) các item từ node trước đó.
Với mỗi item trong mảng đó, nó sẽ chạy toàn bộ các node được kết nối phía sau nó (hay còn gọi là "nhánh con").
Tổng hợp kết quả từ tất cả các vòng lặp và truyền đến node tiếp theo.
Tại sao Loop Node lại quan trọng?
Xử lý hàng loạt (Batch Processing): Thực hiện cùng một hành động trên nhiều đối tượng (ví dụ: gửi email cho một danh sách khách hàng, cập nhật nhiều bản ghi trong cơ sở dữ liệu).
Xử lý dữ liệu phân trang (Pagination): Tự động lấy tất cả dữ liệu từ một API có phân trang bằng cách lặp qua từng trang.
Thực hiện các tác vụ phức tạp: Kết hợp nhiều bước lại và lặp lại toàn bộ quy trình đó cho từng mục.
Tối ưu hóa Workflow: Giúp workflow gọn gàng, dễ bảo trì và quản lý hơn so với việc sao chép nhiều node.
Các Loại Loop Node trong n8n
n8n cung cấp một số Loop Node chính, mỗi loại phù hợp với một trường hợp sử dụng khác nhau.
1. ForEach Node (Item Lists)
Cách hoạt động: Đây là Loop Node cơ bản và phổ biến nhất. Nó nhận một mảng các item và thực thi nhánh con cho từng item một cách tuần tự.
Đầu vào mong đợi: Một trường dữ liệu kiểu mảng.
Ví dụ: Một mảng các email từ
[{email: "a@test.com"}, {email: "b@test.com"}].
Khi nào sử dụng:
Gửi email cho từng người trong danh sách.
Tạo một task mới trong Trello/Asana cho mỗi mục tiêu.
Xử lý từng file trong một thư mục.
2. While Node (Do Until)
Cách hoạt động: Node này sẽ lặp lại nhánh con cho đến khi một điều kiện cụ thể được thỏa mãn. Nó tương tự như vòng lặp
whilehoặcdo-whiletrong lập trình.Thiết lập điều kiện: Điều kiện dừng có thể dựa trên:
Giá trị đầu ra: (Ví dụ: lặp cho đến khi phản hồi từ API có trạng thái là "completed").
Số lần lặp tối đa: (Ví dụ: lặp tối đa 10 lần để tránh vòng lặp vô hạn).
Khi nào sử dụng:
Kiểm tra trạng thái của một tiến trình cho đến khi nó hoàn tất.
Thử lại một hành động thất bại sau một khoảng thời gian cho đến khi thành công.
Lấy dữ liệu từ API cho đến khi không còn bản ghi nào.
3. ForEach (Aggregator) Node
Cách hoạt động: Node này hơi khác biệt. Thay vì chạy nhánh con cho từng item, nó tổng hợp tất cả các item đầu vào thành một mảng duy nhất và chạy nhánh con một lần với mảng đó.
Khi nào sử dụng:
Khi bạn cần gửi toàn bộ danh sách dữ liệu đến một API yêu cầu đầu vào là một mảng.
Tổng hợp kết quả từ nhiều node khác nhau trước khi xử lý bước tiếp theo.
Cách Thức Hoạt Động Chi Tiết của ForEach Node (Ví dụ điển hình)
Hãy cùng xem xét một workflow mẫu để hiểu rõ luồng dữ liệu.
Mục tiêu: Lấy một danh sách email từ Google Sheet và gửi một email cá nhân hóa cho từng địa chỉ đó qua Gmail.
Các Node trong Workflow:
Google Sheets (Trigger hoặc Get Rows): Lấy dữ liệu từ một sheet. Giả sử sheet có 2 cột:
NamevàEmail.Đầu ra:
[{ "Name": "An", "Email": "an@test.com" }, { "Name": "Bình", "Email": "binh@test.com" }]
ForEach Node: Được kết nối sau Google Sheets.
Gmail Node: Được kết nối SAU ForEach Node, để gửi email.
Luồng dữ liệu bên trong ForEach Node:
Bước 1: ForEach Node nhận mảng 2 item từ Google Sheets.
Bước 2 (Vòng lặp 1):
ForEach Node lấy item đầu tiên:
{ "Name": "An", "Email": "an@test.com" }.Nó truyền chỉ item này đến Gmail node.
Gmail node nhận được dữ liệu, bạn có thể sử dụng Expression
{{ $json.Email }}cho người nhận và{{ $json.Name }}trong nội dung email.Gmail node thực thi và gửi email cho An.
Bước 3 (Vòng lặp 2):
ForEach Node lấy item thứ hai:
{ "Name": "Bình", "Email": "binh@test.com" }.Nó truyền item này đến Gmail node.
Gmail node lại thực thi, lần này gửi email cho Bình.
Bước 4 (Tổng hợp):
Sau khi tất cả các vòng lặp kết thúc, ForEach Node tổng hợp kết quả từ các lần chạy của Gmail node.
Đầu ra cuối cùng của ForEach Node sẽ là một mảng kết quả:
[ { "resultGmail1" }, { "resultGmail2" } ].
Cấu hình và Biểu thức (Expression) quan trọng
Khi làm việc với Loop Node, việc hiểu cách tham chiếu dữ liệu là rất quan trọng.
Bên trong nhánh con của Loop Node:
Sử dụng
$jsonđể tham chiếu đến dữ liệu của item HIỆN TẠI trong vòng lặp.Ví dụ: Trong Gmail node, dùng
{{ $json.Email }}và{{ $json.Name }}.
Bên ngoài Loop Node (trước/sau nó):
Sử dụng
$inputđể tham chiếu đến tất cả dữ liệu đầu vào ban đầu của Loop Node.Sử dụng
$("Tên_Node").all()hoặc$("Tên_Node").itemđể tham chiếu đến dữ liệu từ một node cụ thể trong nhánh con.
Ví dụ Thực tế: Xử lý Phân trang (Pagination) với While Node
Mục tiêu: Lấy toàn bộ danh sách sản phẩm từ một API có phân trang.
Các Node:
HTTP Request Node (Lấy trang đầu tiên): Gọi API
GET /products?page=1.While Node: Được cấu hình để lặp cho đến khi không còn trang tiếp theo.
HTTP Request Node (bên trong While): Gọi API cho trang tiếp theo.
Cấu hình While Node:
Điều kiện dừng (Mode): "Khi biểu thức là đúng"
Biểu thức:
// Giả sử API trả về một trường "hasNextPage" là false khi hết trang {{ $json["hasNextPage"] === false }} // Hoặc nếu API trả về mảng "products" rỗng {{ $json["products"].length === 0 }}
Số lần lặp tối đa: Đặt là 50 để phòng tránh lỗi.
Luồng hoạt động:
Node HTTP đầu tiên lấy trang 1, kết quả trả về
{ products: [...], hasNextPage: true }.While Node thấy
hasNextPagelàtruenên chạy nhánh con.Node HTTP bên trong While Node cần được cấu hình động để lấy trang tiếp theo. Sử dụng Expression để tăng số trang:
?page={{ ($json.page || 0) + 1 }}(cần điều chỉnh logic phù hợp với API).Quá trình lặp lại cho đến khi API trả về
hasNextPage: false, khi đó While Node dừng lại.
Lưu ý Quan trọng và Best Practices
Tránh Vòng lặp Vô hạn (Đặc biệt với While Node): Luôn luôn đặt "Max Tries" (Số lần thử tối đa) một con số hợp lý. Đây là cơ chế an toàn quan trọng nhất.
Hiểu rõ Luồng dữ liệu: Sự khác biệt giữa
$json(trong vòng lặp) và$input(ngoài vòng lặp) là chìa khóa để tránh lỗi.Hiệu suất:
ForEach Node chạy tuần tự. Nếu danh sách có 100 item và mỗi lần gửi email mất 2 giây, toàn bộ quá trình sẽ mất hơn 3 phút.
Để xử lý song song, hãy khám phá tính năng "Multi-execution" (cần hiểu rõ để tránh xung đột dữ liệu) hoặc sử dụng các API hỗ trợ xử lý hàng loạt.
Xử lý Lỗi: Cấu hình "Error Workflow" cho cả workflow hoặc sử dụng Try/Catch Node (nếu có) bên trong nhánh con để xử lý lỗi cho từng item mà không làm dừng toàn bộ vòng lặp.
Đặt tên có ý nghĩa: Đặt tên cho các node trong nhánh con một cách rõ ràng (ví dụ: "Gửi email cho từng contact") để workflow dễ đọc và debug.
Kết luận
Loop Node là một trong những công cụ mạnh mẽ nhất để xây dựng các workflow tự động hóa phức tạp và linh hoạt trong n8n. Bằng cách làm chủ ForEach Node cho xử lý item danh sách và While Node cho các tác vụ lặp dựa trên điều kiện, bạn có thể mở rộng đáng kể khả năng của n8n, giải quyết các bài toán từ đơn giản đến phức tạp một cách hiệu quả và thanh lịch. Hãy bắt đầu với những ví dụ nhỏ và thực hành để thấy được sức mạnh thực sự của nó.
.jpg)
.jpg)
Nhận xét
Đăng nhận xét