ข้ามไปยังเนื้อหา

สร้างด้วย 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 ได้ง่าย

แอป Hono ตัวนี้รวม validation รูปแบบ error ที่สม่ำเสมอ และ status code ที่ถูกต้องของ resource ชื่อ articles ไว้ด้วยกัน ลองเปิดใน StackBlitz แล้วรันดู

JavaScript

สังเกตว่าทุกแนวคิดจากคอร์สนี้ปรากฏขึ้นอย่างไร ทั้ง 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 ด้วย TypeScriptlearning curve ถ้าคุ้นกับ Express
built-in validation ด้วย Zod integrationcommunity 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
ทำไมจึงควรให้ service ปลอดจากเรื่องของ HTTP?
อะไรควรอยู่ใน handler ที่บาง?
รูปแบบ error ที่สม่ำเสมอเพียงหนึ่งเดียวถูกผลิตขึ้นที่ใดในแอปนี้?