Chuyển tới nội dung chính

Lỗi

Mọi API của Hạ Tầng, từ Email, Thanh toán tới chat gateway, báo lỗi theo cùng một dạng JSON kèm mã HTTP theo quy ước. Trang này giải thích dạng lỗi đó, liệt kê các lỗi bạn dễ gặp nhất cùng cách xử lý, và cách bắt lỗi trong code. Tham chiếu lỗi liệt kê mọi mã lỗi.

Dạng lỗi​

Request thất bại trả status 4xx hoặc 5xx và body như sau:

{
"statusCode": 422,
"name": "validation_error",
"message": "to: Invalid email address"
}
TrườngKiểuÝ nghĩa
statusCodenumberMã HTTP, lặp lại trong body
namestringMã ổn định cho máy đọc. Rẽ nhánh theo trường này.
messagestringMột câu tiếng Anh cho người đọc và cho log. Có thể đổi bất cứ lúc nào; đừng phân tích nội dung của nó.

Với lỗi kiểm tra dữ liệu, message nêu trường đầu tiên bị sai, theo dạng trường: vấn đề.

Mã trạng thái​

StatusÝ nghĩaThử lại?
400Request xung đột với một request trước đó (idempotency)Không, sửa request
401Thiếu API key, hoặc key không được phép làm việc nàyKhông
403Key không hợp lệ, module đang tắt, hoặc thao tác không được phép ở trạng thái nàyKhông
404Tài nguyên không tồn tại, hoặc thuộc doanh nghiệp hay môi trường khácKhông
409Xung đột với trạng thái hiện tại (trùng lặp, hội thoại đã đóng, request đồng thời)Đôi khi, sau khi đọc lại trạng thái
413Tệp tải lên quá lớnKhông
422Body hoặc query không hợp lệKhông, sửa request
429Chạm giới hạn tần suất hoặc hạn mức trong ngàyCó, sau khi chờ (chỉ với giới hạn tần suất)
500, 503Có lỗi phía Hạ Tầng hoặc phía nhà cung cấpCó, với backoff

Các lỗi thường gặp​

nameStatusÝ nghĩaNên làm gì
validation_error422Thiếu trường, trường sai, hoặc body không phải JSON hợp lệĐọc message và sửa request. Đừng gửi lại nguyên như cũ.
validation_error403Chỉ ở Email: tên miền của from chưa xác minhXác minh tên miền
missing_api_key401Thiếu header Authorization: BearerGửi kèm key
invalid_api_key403Key sai định dạng, không tồn tại hoặc đã bị thu hồiKiểm tra key; tạo key mới nếu key đã bị thu hồi
restricted_api_key401Key thiếu scope, hoặc giới hạn tên miền, origin của key không cho phépDùng key có đúng scope
product_disabled403Module đang tắt với doanh nghiệpNhờ chủ sở hữu hoặc quản trị viên bật lại; đừng thử lại
environment_mismatch403Thao tác hoặc key Thanh toán không khớp với môi trườngKiểm tra Hatang-Environment và key
not_found404Doanh nghiệp (và môi trường) này không có tài nguyên đóKiểm tra id; có thể nó thuộc doanh nghiệp hay môi trường khác
invalid_idempotent_request400Idempotency-Key đã được dùng với body khácDùng key mới cho request mới (Idempotency)
concurrent_idempotent_requests409Hai request cùng Idempotency-Key chạy cùng lúcChờ một chút rồi thử lại; bạn nhận kết quả của request đầu
rate_limit_exceeded429Quá nhiều request mỗi giây cho module nàyChờ retry-after giây rồi thử lại (Giới hạn tần suất)
daily_quota_exceeded429Doanh nghiệp đã dùng hết hạn mức email trong ngàyChờ đến 0 giờ UTC hoặc nâng hạn mức
conversation_closed409Hội thoại chat đã đóngMở lại, hoặc bắt đầu hội thoại mới
file_too_large, unsupported_file_type413, 422Tệp tải lên quá lớn hoặc thuộc loại không được nhậnXem giới hạn
invalid_state409Đối tượng không làm được việc đó lúc này, như huỷ một thanh toán đã trảLấy lại đối tượng và kiểm tra trạng thái
application_error500 hoặc 403Lỗi ngoài dự kiến; trả 403 khi việc gửi email của doanh nghiệp đang tạm dừngThử lại 500 với backoff; với 403, mở lại việc gửi ở Email → Cài đặt email
internal_server_error500Có lỗi phía Hạ TầngThử lại với backoff; liên hệ hỗ trợ nếu lỗi kéo dài
provider_unavailable503Ngân hàng hoặc nhà cung cấp hoá đơn điện tử không phản hồiThử lại sau

Xử lý lỗi trong code​

Quyết định theo name và statusCode: thử lại lỗi tạm thời, báo cho người phụ trách lỗi cần người sửa, và ghi log phần còn lại cùng request.

SDK Node.js không bao giờ throw khi API báo lỗi. Mọi hàm trả về { data, error }, trong đó error có cùng statusCode, name và message. Khi hoàn toàn không kết nối được tới API, error.statusCode là 0 và error.name là application_error.

import { Hatang } from "@hatang/sdk";

const hatang = new Hatang(process.env.HATANG_API_KEY, { baseUrl: "https://api.hatang.dev" });

const { data, error } = await hatang.emails.send({ from, to, subject, html }, { idempotencyKey: orderId });

if (error) {
switch (error.name) {
case "validation_error":
// Lỗi của code hoặc dữ liệu đầu vào: ghi log và sửa payload.
logger.error({ error }, "Hatang từ chối email");
break;
case "rate_limit_exceeded":
case "internal_server_error":
case "application_error":
// Tạm thời: thử lại sau với cùng idempotency key.
await queue.retryLater({ orderId });
break;
case "product_disabled":
case "restricted_api_key":
case "invalid_api_key":
// Cấu hình: báo cho người phụ trách, đừng thử lại.
await alertOps(error.message);
break;
default:
logger.error({ error }, "Lỗi Hatang ngoài dự kiến");
}
}
Tìm các lời gọi lỗi

Email → Logs trong dashboard liệt kê mọi request API của doanh nghiệp kèm status, thời gian xử lý, body của request và response. Xem các lời gọi có status 4xx hoặc 5xx để biết chính xác lỗi mỗi lời gọi nhận về.

Bước tiếp theo​

Xem trang này dạng Markdown