Cách luồng chạy (cho người quen n8n)
Luồng tự động của DANIX chạy theo logic của n8n, để người đã dùng n8n không phải học lại. Trang này đặt tên khái niệm n8n ở lần nhắc đầu (Merge, Aggregate, On Error, Execute Once, paired item, Retry with currently saved / original workflow) rồi dùng tên tiếng Việt như trên màn hình của ứng dụng Tự động hoá. Cuối trang có bảng Khác n8n.
Tóm tắt Giống n8n / Khác n8n
| Giống n8n | Khác n8n |
|---|---|
| Chạy lần lượt từng nhánh, nhánh nằm trên chạy trước | Chỉ MỘT khối Kích hoạt mỗi luồng, đồ thị không có vòng |
| Mỗi khối nhận và ra một danh sách mục | Không có khối mã (Code) và không có kiểu gộp SQL |
| Khối Gửi HTTP chạy cho từng mục | Địa chỉ nhận và header không nhận biến |
| Khối Gộp (Merge) và khối Gom (Aggregate) | Kiểu Gom "cả mục" luôn đặt danh sách vào trường items |
| "Khi lỗi" ba lựa chọn (ở khối Gửi HTTP), "Chạy một lần" như Execute Once | "Khi lỗi" chỉ có ở khối Gửi HTTP; lưu luồng huỷ cả lượt đang chạy của bản cũ |
| "Gửi lại" hai nút | Thử lại dài tới khoảng 44 giờ do DANIX lo |
1. Thứ tự chạy
Thứ tự giống thứ tự v1 của n8n: luồng đi trọn một nhánh tới cuối rồi mới sang nhánh kế. Khi một khối có nhiều khối con, khối con nằm trên (toạ độ y nhỏ hơn) chạy trước; cùng độ cao thì khối nằm bên trái chạy trước. Số thứ tự hiện ngay trên mỗi khối ở bảng vẽ, nên bạn kéo khối lên hay xuống để đổi thứ tự.
Ví dụ: khối Kích hoạt nối vào khối Nếu. Ngả Đúng nối tới khối A (ở trên), A nối tiếp tới khối C. Ngả Sai nối tới khối B (ở dưới). Thứ tự là Kích hoạt (1), Nếu (2), A (3), C (4), B (5): nhánh trên chạy trọn tới C rồi mới sang B. Số thứ tự trên bảng vẽ giả định mọi cổng đều có mục; lượt chạy thật có thể bỏ qua khối không nhận được mục nào.
Một lượt chạy tại một thời điểm chỉ chạy một khối. Vì thế không có tranh chấp giữa hai nhánh của cùng lượt về dữ liệu. Nhưng nhiều lượt chạy của cùng một luồng (mỗi sự kiện một lượt) có thể chạy song song, nên bên nhận có thể nhận nhiều request cùng lúc từ một luồng — đừng giả định luồng gửi tuần tự.
2. Mục (item)
Mỗi khối nhận vào và đưa ra một danh sách mục. Khối Kích hoạt ra đúng một mục: envelope của sự kiện. Khối Gửi HTTP chạy một lượt cho mỗi mục và ra một mục { status, headers, body } cho mỗi lượt (thân trả về là mảng thì mỗi phần tử thành một mục).
Để lấy dữ liệu của khối trước, dùng biến #{NODE(<khoá>). trong mẫu JSON và trong bộ lọc, với <khoá> là khoá ngắn của khối (hiện ở cài đặt khối, không đổi khi bạn đổi nhãn):
| Biến | Nghĩa | Tương đương n8n |
|---|---|---|
#{NODE(<khoá>). |
Mục của khối ấy gắn với mục đang xử lý (như paired item). Dạng chính. | $('Khối'). |
#{NODE(<khoá>). |
Mục đầu tiên khối ấy ra. | $('Khối'). |
#{NODE(<khoá>). |
Số mục khối ấy ra (không tính cổng lỗi). | $('Khối'). |
#{NODE(<khoá>). |
Danh sách mọi mục (json) của khối ấy, thành mảng. Chỉ đứng trọn một giá trị chuỗi của mẫu, không dùng trong bộ lọc. |
$('Khối'). |
Ví dụ: sau một khối Gửi HTTP có khoá http_1, viết #{NODE(http_1). hay #{NODE(http_1).. Đường dẫn sau . hay . gồm các đoạn chữ, số, _, -, tối đa 8 đoạn; chỉ số mảng viết bằng số.
Hai điều khác biểu thức n8n: không có đoạn . (n8n viết $('Khối')., DANIX viết #{NODE(http_1).), và biến chỉ thay giá trị trên cây JSON chứ không chạy biểu thức JavaScript.
Quy tắc khác:
- Biến chỉ tham chiếu được khối tổ tiên: khối nằm trên đường dây dẫn tới khối đang soạn.
- Khối chưa chạy ở lượt này cho giá trị vắng: biến chiếm trọn một giá trị chuỗi thành
null, biến lẫn trong chuỗi thành rỗng,.thành 0.count - Khối có nhiều dây vào chạy một lần cho mỗi nhánh tới, như n8n.
- Khối nhận 0 mục thì không chạy: nhật ký không có lần gọi nào của nó.
3. Gộp (Merge)
Khối Gộp nhận 2 đến 4 danh sách ở các cổng in1…in4, chờ đủ mọi đầu vào rồi mới chạy, và ra một danh sách. Mỗi cổng vào phải có đúng một dây. Nếu một nhánh không bao giờ tới (ví dụ nhánh Nếu bị bỏ) thì khi không còn việc nào khác, Gộp chạy với các đầu vào đang có. Có năm kiểu, không có kiểu SQL (nó cho chạy truy vấn tuỳ ý trên máy chủ).
Ghép hai mục là ghép nông theo khoá của json; trùng khoá thì cổng đứng sau thắng, như n8n ưu tiên Input 2. Số mục ra vượt 100 thì lượt chạy thất bại với limit_exceeded, không cắt âm thầm.
Nối danh sách
Kiểu append (Append của n8n). Mọi mục của cổng 1, rồi cổng 2…, giữ thứ tự. Vào: cổng 1 [{a:1}, {a:2}], cổng 2 [{a:3}]. Ra: [{a:1}, {a:2}, {a:3}].
Ghép theo trường trùng
Kiểu combine_by_fields (Combine by Matching Fields). Ghép cặp mục của hai cổng có giá trị trùng ở 1 đến 3 cặp trường (left ở cổng 1, right ở cổng 2). Chỉ dùng với hai cổng vào. Tuỳ chọn keep:
matches(mặc định): chỉ giữ cặp khớp;input1_enriched: giữ mọi mục của cổng 1 và bổ sung dữ liệu từ mục khớp ở cổng 2;all: giữ cả cặp khớp lẫn mục không khớp của hai cổng.
Ví dụ ghép đơn với khách theo customerId = id: vào cổng 1 [{orderCode:"A1", customerId:7}], cổng 2 [{id:7, name:"Lan"}], ra [{orderCode:"A1", customerId:7, id:7, name:"Lan"}]. Trường so sánh theo giá trị: chuỗi theo chuỗi, số theo số.
Ghép theo thứ tự
Kiểu combine_by_position (Combine by Position). Mục thứ i của mọi cổng ghép thành một mục. Số mục ra bằng số mục của cổng ít nhất. Vào: cổng 1 [{a:1}, {a:2}], cổng 2 [{b:"x"}]. Ra: [{a:1, b:"x"}].
Mọi tổ hợp
Kiểu all_combinations (All Possible Combinations). Mọi cặp mục cổng 1 × cổng 2; chỉ dùng với hai cổng vào. Vào: cổng 1 [{a:1}, {a:2}], cổng 2 [{b:"x"}, {b:"y"}]. Ra 4 mục: {a:1,b:"x"}, {a:1,b:"y"}, {a:2,b:"x"}, {a:2,b:"y"}.
Chọn một ngả
Kiểu choose_branch (Choose Branch). Đợi mọi cổng, rồi ra nguyên các mục của cổng đã chọn (input), bỏ các cổng còn lại. Dùng để đồng bộ hai nhánh mà chỉ lấy dữ liệu của một nhánh.
4. Gom (Aggregate)
Khối Gom nhận mọi mục đầu vào và gộp thành một mục ra. Dùng khi muốn gửi cả danh sách trong một lượt: đặt Gom ngay trước khối Gửi HTTP. Tối đa 100 mục vào; vượt thì limit_exceeded.
Gom cả mục vào một danh sách
Kiểu all_items. Ra một mục { items: [<json mục 1>, <json mục 2>, …] }. Vào ba mục {id:101}, {id:102}, {id:103}; ra một mục { items: [{id:101},{id:102},{id:103}] }. Khác n8n: tên trường cố định là items (n8n mặc định data và cho đổi), để biến và tài liệu chỉ có một tên.
Gom từng trường thành danh sách
Kiểu fields. Mỗi trường bạn chọn (path và tên ra as) thành một danh sách giá trị. Với fields: [{ path: "body., vào ba mục có body. là 101, 102, 103, ra một mục { ids: [101, 102, 103] }. Mục thiếu trường ấy thì bỏ qua giá trị ấy. Tối đa 10 trường; tên ra khớp ^[A-Za-z_][A-Za-z0-9_]{0,63}$ và không dùng __proto__, constructor, prototype.
Sau khối Gom, #{NODE(<khối trước Gom>). không còn xác định (không biết chọn mục nào trong số đã gom); hãy dùng #{NODE(gom)., ., . hoặc . của chính khối Gom.
5. Khi lỗi (On Error)
Chỉ khối Gửi HTTP có cài đặt Khi lỗi, với ba lựa chọn. Khối Nếu, Gộp, Gom chỉ lỗi khi vượt giới hạn số mục hay dung lượng, và vượt giới hạn luôn dừng cả lượt chạy (limit_exceeded), nên ba khối này không có cài đặt ấy: onError khác stop gửi lên ở chúng được đưa về stop. Khối Kích hoạt cũng không có, và luôn dừng khi lỗi. Với khối Gửi HTTP, "lỗi" là lỗi sau khi đã hết lịch thử lại (hoặc ngay lượt đầu nếu bạn tắt thử lại, hoặc lỗi không thử lại được).
Dừng luồng
Giá trị stop (mặc định). Lần gọi khối ghi failed, cả lượt chạy failed, các khối đang chờ phía sau bị huỷ với lý do stopped_by_error nhưng được giữ lại để bạn dùng Gửi lại chạy tiếp.
Bỏ qua và chạy tiếp
Giá trị continue (Continue của n8n). Mục lỗi trở thành mục { error: { code, message, status? } } đi ra cổng thường, nên các khối phía sau vẫn chạy và có thể đọc error.
Đi theo ngả lỗi
Giá trị error_port (Continue using error output). Khối Gửi HTTP có thêm cổng ra error: mục lỗi ra cổng error, mục thành công ra cổng out. Bắt buộc nối dây từ cổng error (để mục lỗi không rơi mất mà không ai thấy), và ngược lại cổng error chỉ có dây khi chọn lựa chọn này.
Chạy một lần (Execute Once)
Cài đặt Chạy một lần (chỉ mục đầu) giống Execute Once của n8n: khối chỉ nhận mục đầu của mỗi cổng vào, các mục còn lại bị bỏ. Khối Kích hoạt không có cài đặt này. Muốn gửi cả danh sách trong một lượt, dùng khối Gom thay vì Chạy một lần.
Thử lại
Khối Gửi HTTP thử lại dài 8 lượt trong khoảng 44 giờ (bật mặc định, tắt được), do DANIX lo. Trong lúc chờ, lượt chạy dừng ở khối ấy. Lịch và quy tắc: Luồng tự động và webhook. Lỗi phía DANIX (ví dụ máy chủ đang khởi động lại giữa một lượt gửi) được thử lại riêng theo lịch ngắn — 5 giây, 30 giây, 2 phút — ở luồng đang chạy thật, kể cả khi bạn tắt thử lại; lượt "Chạy thử" không thử lại.
Gửi lại
Khối lỗi trong nhật ký có hai nút, như n8n (Retry with currently saved workflow / Retry with original workflow). Cả hai chạy lại khối lỗi và phần phía sau:
- Với bản luồng đang lưu: dùng địa chỉ, thông tin bí mật và quyền của bản hiện tại. Đây là tin mới nên mang
webhook-idmới. Nút mờ khi khối không còn tồn tại (cùngidvà khoá) hoặc khối Kích hoạt đã đổi. - Với bản cũ: chạy bằng phiên bản của lượt chạy, giữ nguyên
webhook-id. Chỉ dùng được khi địa chỉ nhận của mọi khối Gửi HTTP sẽ chạy lại (khối lỗi và các khối phía sau nó) chưa đổi so với bản đã lưu bí mật; một khối trong số ấy đã bị gỡ khỏi bản đang lưu thì nút này bị chặn.
Cả hai kiểm quyền và trang của người bấm, chỉ cho một lượt gửi lại mỗi lúc, và bị từ chối khi luồng đang tắt hoặc shop không dùng được. Gửi lại chỉ có trên khối lỗi.
Khác n8n
- Không có kiểu gộp SQL, và không có khối mã (Code).
- Kiểu Gom "cả mục" luôn đặt danh sách vào trường
items(n8n mặc địnhdata, cho đổi). - "Khi lỗi" chỉ có ở khối Gửi HTTP (n8n có ở mọi khối): khối Nếu, Gộp, Gom lỗi là dừng cả lượt chạy, và một dây cũ còn nối ở cổng
errorcủa ba khối ấy bị bỏ qua. "Chạy một lần" không có ở khối Kích hoạt. - Thử lại dài tới khoảng 44 giờ do DANIX lo; n8n không có.
- Mỗi lần gọi khối tối đa 100 mục, mỗi lượt chạy tối đa 500 lượt xử lý mục. Vượt thì lượt chạy thất bại
limit_exceeded(lỗi phía DANIX). - Địa chỉ nhận và header không nhận biến (n8n cho biểu thức ở URL và header).
- Biến chỉ thay giá trị, không chạy biểu thức JavaScript.
- Biến chỉ tham chiếu được khối tổ tiên.
- Đúng một khối Kích hoạt mỗi luồng và đồ thị không có vòng (n8n cho nhiều trigger và có vòng lặp).
- Trần tĩnh của một luồng: 30 khối, 60 dây, 10 khối Gửi HTTP, 10 khối Gộp, 10 khối Gom, đường dài nhất 15 khối.
- Đường biến không có đoạn
..json - Lưu luồng (tạo phiên bản mới) huỷ cả lượt đang chạy lẫn lượt đang chờ thử lại tới 44 giờ của phiên bản cũ; n8n để chúng chạy nốt.