Nếu bạn đã quen với Express, cách trả response trong Hono sẽ không quá xa lạ — nhưng có một vài điểm khác biệt quan trọng cần nắm, đặc biệt khi làm việc với TypeScript.
Trong Express, bạn dùng res để trả response. Trong Hono, bạn dùng context c — và quan trọng là bạn phải return kết quả thay vì chỉ gọi method.
Các loại response phổ biến
JSON
Đây là loại response phổ biến nhất trong REST API.
Hono tự động set Content-Type: application/json — không cần khai báo thêm.
Text
HTML
XML, CSV, hoặc bất kỳ Content-Type nào khác
Với những định dạng Hono không có helper sẵn, dùng c.body():
Bạn cũng có thể dùng new Response() (Web Standard API) và Hono chấp nhận — nhưng dùng c.body() nhất quán hơn khi làm việc trong Hono context.
Redirect
Status Code
Trong Express, bạn hay thấy cách viết chain:
Trong Hono, status code là tham số thứ hai của helper:
Các status code phổ biến cần nhớ
Lưu ý: 204 No Content không có body — đừng gọi c.json() hay c.text() kèm theo.
Context c — req và res gộp làm một
Trong Express, bạn có req và res riêng biệt. Hono gộp cả hai vào một object duy nhất là c (Context):
Type của Context
Khi cần tách handler ra file riêng thay vì viết inline, import Context để khai báo type:
Variables — Truyền data giữa các middleware
Đây là tính năng hay bị bỏ qua, nhưng rất hữu ích khi dùng middleware.
Trong Express, bạn hay làm thế này:
Hono có cách làm tương tự nhưng type-safe hơn với c.set() / c.get(), kết hợp khai báo Variables:
Variables chỉ tồn tại trong phạm vi một request — khi response trả về, context bị huỷ và data mất theo. Đây không phải global state.
Nếu không khai báo Variables, c.get() sẽ trả về unknown và TypeScript sẽ phàn nàn.
Lưu ý cho TypeScript
Khai báo kiểu dữ liệu cho response
Hono hỗ trợ generic type cho c.json(), giúp bạn kiểm soát chính xác shape của response:
Luôn return response trong Hono
Đây là điểm khác biệt lớn nhất so với Express:
TypeScript sẽ cảnh báo nếu bạn quên return — đây là một trong những lý do nên dùng TypeScript với Hono.
Tóm tắt
Điểm khác biệt cốt lõi so với Express: Hono yêu cầu return, dùng c thay vì res, và được thiết kế để tận dụng tối đa TypeScript từ đầu.
Bước tiếp theo: Tìm hiểu về Hono Middleware (app.use()), Validation với Zod (@hono/zod-validator), và cách tổ chức routes với Hono Router.