สร้างด้วย Hono
ถึงเวลาประกอบชิ้นส่วนเข้าด้วยกัน การสร้างจริงที่สะอาดจะแยก routing, validation และ business logic ออกจากกัน และเดินสาย cross-cutting concern (auth, error, CORS) เป็น middleware
โครงสร้างที่สมเหตุสมผล
หัวข้อที่มีชื่อว่า “โครงสร้างที่สมเหตุสมผล”src/ index.ts // create the app, mount middleware + routes, start the server middleware/ // auth, error handler, CORS, rate limiting routes/ // one module per resource (articles, users, ...) services/ // business logic, independent of HTTP schemas/ // request/response validation (e.g. zod)handler ยังคงบาง คือ validate input เรียก service แล้วจัดรูป response ส่วน service ไม่รู้อะไรเกี่ยวกับ HTTP เลย จึง unit-test ได้ง่าย
resource ขนาดเล็ก ครบตั้งแต่ต้นจนจบ
หัวข้อที่มีชื่อว่า “resource ขนาดเล็ก ครบตั้งแต่ต้นจนจบ”แอป Hono ตัวนี้รวม validation รูปแบบ error ที่สม่ำเสมอ และ status code ที่ถูกต้องของ resource ชื่อ articles ไว้ด้วยกัน ลองเปิดใน StackBlitz แล้วรันดู
สังเกตว่าทุกแนวคิดจากคอร์สนี้ปรากฏขึ้นอย่างไร ทั้ง envelope ของ collection ที่ทำ pagination, 201 Created พร้อม Location, การ validate แบบ 422 พร้อม error ราย field, 404 ผ่าน error ที่มี type ที่ถูก throw ออกมา และ onError ตัวกลางเพียงหนึ่งเดียวที่ผลิต problem+json
| ข้อดี (Hono) | ข้อแลกเปลี่ยน |
|---|---|
| รันบน Edge runtime (Cloudflare Workers, Bun, Deno) — latency ต่ำ | ecosystem เล็กกว่า Express |
| type-safe middleware ด้วย TypeScript | learning curve ถ้าคุ้นกับ Express |
| built-in validation ด้วย Zod integration | community resource น้อยกว่า NestJS/Express |
| เร็วกว่า Express — benchmark ดีกว่าใน most scenario | ยังไม่มี decorator-based MVC เหมือน NestJS |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”ไม่มี Centralized Error Handler อาการ:
- แต่ละ route handler catch error ของตัวเอง
- error format ไม่สม่ำเสมอ
- ใช้
app.onError((err, c) => { ... })— handle ทุก uncaught error ในที่เดียว
Middleware Order ผิด อาการ:
- authentication middleware ลงทะเบียนหลัง route — route run ก่อน auth check
- request ที่ไม่ authenticate เข้าถึง protected route ได้
- ลงทะเบียน middleware ก่อน route เสมอ:
app.use(auth)ก่อนapp.get('/protected', handler)
💡 ตัวอย่างจากของจริง
Cloudflare Workers:
- Hono เป็น framework ที่แนะนำสำหรับ Workers — รันบน V8 Isolate
- latency ต่ำมากเพราะรันที่ edge ใกล้ user
Vercel Edge Functions:
- Hono รองรับ Vercel Edge runtime
- API ที่ต้องการ global low latency เหมาะกับ edge deployment