
กำลังโหลด...

กำลังโหลด...

Boss ตัวนี้พี่จะไม่บอกว่าข้อมูลไหนไปทางไหนนะ — น้องต้องตัดสินใจเอง
นี่คือทักษะที่แยกคนที่ "เขียน API ตามที่สั่ง" ออกจากคนที่ "ออกแบบ API ได้" เขียนเหตุผลกำกับมาด้วยว่าทำไมเลือกแบบนั้น
เป้าหมายของ Boss นี้: ใช้ทั้ง 4 ช่องทางร่วมกันในระบบเดียว และออกแบบ API ได้เองว่า ข้อมูลชิ้นไหนควรไปทางไหน
"ข้อมูลชิ้นนี้ควรส่งมาทางไหน?"
+-------------------+
| เป็นความลับไหม? |
+-------------------+
|ใช่ |ไม่ใช่
v v
+----------------+ +--------------------------+
| body / header | | จำเป็นต้องมีเสมอไหม? |
+----------------+ +--------------------------+
|ใช่ (ระบุตัวตน) |ไม่ (ตัวเลือกเสริม)
v v
req.params req.query
ตัวอย่างการตัดสินใจจริง
| ข้อมูล | ช่องทาง | เหตุผล |
|---|---|---|
| id ของหนังสือที่จะแก้ | params |
ระบุว่าแก้เล่มไหน ขาดไม่ได้ |
| หน้าที่เท่าไหร่ | query |
ไม่ส่งก็ได้ ใช้ค่าเริ่มต้น |
| ชื่อหนังสือใหม่ | body |
ข้อมูลที่จะบันทึก |
| รหัสผ่าน | body |
ความลับ ห้ามอยู่ใน URL |
| Token | headers |
ต้องแนบทุก Request รวม GET ที่ไม่มี body |
| อาการ | สาเหตุ |
|---|---|
| เทียบตัวเลขจาก query/params แล้วผลผิด | ลืม Number() — ทุกค่าเป็น string |
GET /books คืน Array ว่างทั้งที่มีข้อมูล |
เขียน filter โดยไม่เช็กว่า query มีค่าจริงไหม |
| ลำดับข้อมูลเปลี่ยนเองหลังเรียก sort | .sort() แก้ Array ต้นฉบับ ลืม [...books] |
req.body undefined หรือ {} |
ลืม express.json() / Content-Type ผิด |
| อ่าน header ไม่ได้ | ใช้ตัวพิมพ์ใหญ่ หรือใช้ . แทน [] |
?flag=false ยังทำงานเหมือน true |
string "false" เป็น truthy |
| pagination หน้าสุดท้ายว่างเปล่า | คำนวณ start ผิด หรือไม่ได้ตรวจ page เกิน totalPages |

Boss Battle — ระบบยืมหนังสือ
ลูกค้าอยากได้ระบบยืมหนังสือ มีข้อมูลเหล่านี้ที่ต้องส่งมาหา Server ตัดสินใจว่าแต่ละอันควรไปทางไหน (params / query / body / headers) พร้อมเหตุผล
| # | ข้อมูล | ช่องทาง? | เหตุผล? |
|---|---|---|---|
| 1 | id ของหนังสือที่จะยืม | ||
| 2 | ชื่อผู้ยืม | ||
| 3 | จำนวนวันที่จะยืม | ||
| 4 | API key ของแอป | ||
| 5 | หน้าที่เท่าไหร่ (ตอนดูรายการยืม) | ||
| 6 | สถานะที่ต้องการกรอง (active / returned) |
1. POST /books/:id/borrow — ยืมหนังสือ
x-api-key ถูกต้อง → ไม่มี 401, ผิด 403id ไม่มีในระบบ → 404borrower (ชื่อผู้ยืม) และ days (จำนวนวัน) → ขาด 400days ต้องเป็นตัวเลข 1-30 → นอกช่วง 400{
"id": 1,
"bookId": 3,
"bookTitle": "สี่แผ่นดิน",
"borrower": "สมชาย",
"days": 7,
"borrowedAt": "2026-08-06T...",
"dueDate": "2026-08-13T...",
"status": "active"
}
2. GET /borrows — ดูรายการยืม
?status=active หรือ ?status=returned (ไม่ส่ง = เอาทั้งหมด)?borrower=สมชาย กรองตามชื่อผู้ยืม?page=1&limit=5 แบ่งหน้าtotal และ totalPages3. PUT /borrows/:id/return — คืนหนังสือ
status เปลี่ยนเป็น returned
ข้อ 1. ยืมหนังสือที่มีคนยืมอยู่แล้ว ควรตอบ Status อะไร
ข้อ 2. ทำไม API key ถึงควรอยู่ใน headers ไม่ใช่ query
ข้อ 3. ชื่อผู้ยืมและจำนวนวัน ควรส่งมาทางไหน
ข้อ 4. GET /borrows?status=active&page=2 — ทำไม status และ page ถึงใช้ query
ข้อ 5. ลำดับการตรวจสอบใน POST /books/:id/borrow ควรเป็นอย่างไร