Nhánh lỗi trong n8n phải làm được ba việc: biết có node vừa lỗi, xác định đó là loại lỗi gì, và báo cho người phụ trách một thông tin đủ để xử lý. Tôi phân loại theo mã HTTP và theo thân phản hồi, vì thông báo của n8n có lúc dùng cùng một câu cho hai nguyên nhân khác nhau. Chỉ lỗi tạm thời mới được thử lại, và tôi không chạy lại trên dữ liệu thật của khách nếu bước ghi không đảo ngược được.
Lần lỗi khiến tôi phải ghi lại
Tôi có một mẫu n8n nhỏ: nhận webhook, kiểm dữ liệu, ghi một dòng. Khi kiểm, tôi cố ý làm một node lỗi. Webhook vẫn trả 200 với thân rỗng {}. Bên gọi không thể biết dòng đó chưa hề được ghi. Lỗi có hiện trong lịch sử thực thi, nhưng ít ai mở lịch sử của một luồng trông vẫn chạy bình thường. Mẫu đó đến giờ vẫn chưa có nhánh lỗi, và tôi sẽ không giao cho khách khi chưa thêm.
Bảy lỗi, ghi trên n8n chạy cục bộ
Để biết nhánh lỗi thực sự nhận được gì, tôi dựng bảy luồng rất nhỏ. Mỗi luồng gồm một nút chạy tay và một node HTTP Request gọi tới máy chủ giả trên máy tôi, mỗi địa chỉ của máy chủ giả trả về đúng một kiểu lỗi. Tôi chạy chúng trên n8n 2.20.0 cục bộ ngày 10/11/2026 và chép nguyên văn thông báo:
- 401, thiếu thông tin xác thực: "Authorization failed - please check your credentials"
- 401, token hết hạn: vẫn câu đó
- 403: "Forbidden - perhaps check your credentials?"
- 429: "The service is receiving too many requests from you"
- 200 nhưng JSON hỏng: "Invalid JSON in response body"
- 503: "Service unavailable - try again later or consider setting this node to retry automatically (in the node settings)"
- 404: "The resource you are requesting could not be found"
Hai dòng đầu là điều đáng giá nhất. Thiếu thông tin xác thực và token hết hạn cho ra cùng một câu, nên nhánh lỗi chỉ đọc thông báo sẽ khiến người sửa đi sửa nhầm chỗ. Trong máy chủ giả của tôi, trường hợp hết hạn có token_expired trong thân phản hồi. Muốn tách hai trường hợp thì nhánh lỗi phải đọc thân.
Các lần chạy này dùng máy chủ giả, nên chúng cho biết n8n 2.20.0 báo gì với từng mã lỗi. Chúng không cho biết một API thật hay luồng OAuth thật sẽ phản hồi ra sao, và tôi chưa thử các bài này trên Zapier hay Make.
Nhánh lỗi gồm những gì
Tôi có một hàm Python nhỏ, classify(status, headers, body), nhận mã trạng thái và thân phản hồi rồi trả về nguyên nhân khả dĩ cùng việc nên làm tiếp. Hàm có chín test đơn vị chạy với máy chủ giả. Thứ tự kiểm rất quan trọng:
if status == 429 or (status >= 400 and "rate" in low and "limit" in low):
... # rate_limit: đọc Retry-After
if status == 401 and "expired" in low:
... # token_expired, kiểm trước 401 thông thường*Đoạn rút gọn. Hàm thật còn nhận token_expired trong thân phản hồi.*
Giới hạn tốc độ được kiểm đầu tiên, để mã 4xx nào có thân nhắc tới rate limit cũng được xử lý như giới hạn tốc độ. Token hết hạn đứng trước trường hợp 401 chung. Trong n8n, nhánh lỗi của tôi đại khái làm như sau:
- Bắt lỗi bằng Error Trigger trong một Error workflow, để mọi luồng báo lỗi theo cùng một cách.
- Ghi nguyên văn thông báo, node lỗi và thời điểm. Tôi không đoán nguyên nhân trước khi đọc mấy thông tin này.
- Chia theo nguyên nhân. Lỗi 429 hoặc 5xx được bật Retry On Fail có giới hạn số lần và có chờ, dùng Retry-After nếu dịch vụ gửi kèm. Lỗi 401, 403, 404 không thử lại, vì thử lại không sửa được credential, quyền thiếu hay ID sai.
- Gửi cảnh báo tới người sẽ đọc nó, kèm nguyên nhân và bước nên làm.
- Nếu luồng do webhook gọi, trả mã lỗi rõ ràng cho bên gọi thay vì 200 rỗng.
Hàm phân loại chỉ là gợi ý. Nó so mã và từ khoá, nên tôi vẫn mở thân phản hồi ra đọc.
Phần tôi chưa kiểm
Danh sách kiểm của tôi còn năm mục nữa: dữ liệu vào thiếu trường hoặc sai kiểu, webhook chạy được với URL test nhưng ra 404 ở production, hết thời gian chờ, các kiểu lỗi im lặng khác ngoài trường hợp kể trên, và bản ghi bị ghi hai lần. Những mục này đến từ kinh nghiệm chung. Tôi chưa có luồng thử hay thông báo ghi lại cho chúng, nên hiện chúng chỉ nằm trong danh sách những chỗ cần xem.
Nếu bạn có một workflow n8n hay lỗi âm thầm hoặc lỗi mà không rõ vì sao, hãy gửi tôi mô tả luồng đó làm gì, hiện đang chạy thế nào và thông báo lỗi gần nhất bạn thấy. Thường chừng đó đủ để tôi nói được mình sẽ bắt đầu từ đâu.