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

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

ก่อนจะปล่อยให้เขียน Server จริง พี่ขอเช็กก่อนว่าน้องอ่าน API ออกจริงๆ
โจทย์คือ ยิง API จริง 3 เส้นแล้วอ่านผลให้ครบ พร้อมตอบให้ได้ว่าแต่ละสถานการณ์ Server ควรตอบ Status Code อะไร — ผ่านด่านนี้แล้วเดี๋ยวเราลงมือกันเลย
เป้าหมายของ Boss นี้: เลือก HTTP Status Code ให้ถูกสถานการณ์ และอ่าน API จริงให้ออก ทั้งวงจร
จบ Boss นี้คุณจะ
ทุก Response มีตัวเลข 3 หลักติดมาด้วยเสมอ เพื่อบอกว่า ผลเป็นอย่างไร โดยที่โปรแกรมไม่ต้อง อ่านข้อความ
หลักแรกบอกหมวด — จำแค่นี้ก็ใช้งานได้ 90%
1xx -> กำลังดำเนินการ (แทบไม่ได้ใช้เอง)
2xx -> สำเร็จ "เรียบร้อย"
3xx -> เปลี่ยนเส้นทาง "ย้ายไปที่อื่นแล้วนะ"
4xx -> Client ผิด "คุณส่งมาผิด" <-- ผู้ใช้/Frontend ต้องแก้
5xx -> Server ผิด "ผมพังเอง" <-- Backend ต้องแก้
เส้นแบ่งที่สำคัญที่สุดคือ 4xx กับ 5xx — 4xx แปลว่า "อย่ามาโทษผม คุณส่งมาไม่ถูก" ส่วน 5xx แปลว่า "ผมผิดเอง" ถ้าใช้ผิดหมวด ทีมจะไล่บั๊กผิดที่ทั้งทีม
flowchart TD
A["Request เข้ามา"] --> B{"ข้อมูลที่ส่งมาถูกต้องไหม?"}
B -->|"ไม่ถูก"| C["400 Bad Request"]
B -->|"ถูก"| D{"มี Token / ล็อกอินหรือยัง?"}
D -->|"ยังไม่ล็อกอิน"| E["401 Unauthorized"]
D -->|"ล็อกอินแล้ว"| F{"มีสิทธิ์ทำสิ่งนี้ไหม?"}
F -->|"ไม่มีสิทธิ์"| G["403 Forbidden"]
F -->|"มีสิทธิ์"| H{"หาข้อมูลที่ขอเจอไหม?"}
H -->|"ไม่เจอ"| I["404 Not Found"]
H -->|"เจอ"| J{"โค้ดเราพังระหว่างทางไหม?"}
J -->|"พัง"| K["500 Internal Server Error"]
J -->|"ไม่พัง"| L["200 OK / 201 Created"]
+------+---------------------------+------------------------------------------+
| Code | ชื่อ | ใช้เมื่อไหร่ในคอร์สนี้ |
+------+---------------------------+------------------------------------------+
| 200 | OK | GET สำเร็จ / PUT สำเร็จ / DELETE สำเร็จ |
| 201 | Created | POST สร้างข้อมูลใหม่สำเร็จ |
| 204 | No Content | สำเร็จแต่ไม่มีอะไรจะตอบกลับ (DELETE ก็ใช้ได้) |
+------+---------------------------+------------------------------------------+
| 400 | Bad Request | ผู้ใช้ไม่ส่ง title มา / ส่งข้อมูลผิดรูปแบบ |
| 401 | Unauthorized | ไม่มี Token หรือ Token ผิด (คอร์ส 2) |
| 403 | Forbidden | มี Token แต่ไปยุ่งข้อมูลคนอื่น (คอร์ส 2) |
| 404 | Not Found | หา id นั้นไม่เจอ / ไม่มี route นี้ |
| 409 | Conflict | สมัครด้วยอีเมลที่มีคนใช้แล้ว (คอร์ส 2) |
+------+---------------------------+------------------------------------------+
| 500 | Internal Server Error | โค้ดเรา throw error / ต่อ DB ไม่ได้ |
+------+---------------------------+------------------------------------------+
401 vs 403 — สับสนกันบ่อยที่สุด
401 Unauthorized = "คุณเป็นใคร?" → ยังไม่ได้ล็อกอิน หรือ Token หมดอายุ403 Forbidden = "รู้ว่าคุณเป็นใคร แต่คุณไม่มีสิทธิ์" → ล็อกอินแล้วแต่ไปแก้ข้อมูลคนอื่น| ปัญหา | ทำไมถึงแย่ |
|---|---|
ตอบ 200 OK ทุกกรณี แม้ตอนพัง |
Frontend แยกไม่ออกว่าสำเร็จหรือล้มเหลว ต้องมานั่งอ่านข้อความเอา |
ตอบ 500 ตอนผู้ใช้กรอกข้อมูลไม่ครบ |
ผู้ใช้ผิด ไม่ใช่เราผิด → ต้องเป็น 400 |
ตอบ 404 ตอน Token หมดอายุ |
ควรเป็น 401 เพราะเป็นเรื่องตัวตน ไม่ใช่หาไม่เจอ |
| ส่ง Status ถูกแต่ไม่ส่งข้อความอธิบาย | ควรมี body บอกสาเหตุด้วย เช่น { "error": "title is required" } |
ตั้งแต่ Chapter 2 เป็นต้นไป เราจะพิมพ์คำสั่งใน Terminal ตลอดทั้งคอร์ส หน้านี้เปิดย้อนกลับมาดูได้ตลอดเมื่อจำคำสั่งไม่ได้
Windows มี Terminal มาให้ 2 ตัว หน้าตาคล้ายกันมาก (จอดำๆ พิมพ์คำสั่งได้เหมือนกัน) แต่ คอร์สนี้ใช้ cmd เพราะ PowerShell มี 3 เรื่องที่จะทำให้ติดกลางทาง
| เรื่อง | cmd | PowerShell | ผลที่เกิด |
|---|---|---|---|
| ระบบกันสคริปต์ (Execution Policy) | ไม่มี | เปิดอยู่ตั้งแต่แรก | ตอนสั่ง npm PowerShell จะไปเรียกไฟล์ npm.ps1 แล้วถูกบล็อก ขึ้น error npm : File ... cannot be loaded because running scripts is disabled on this system — ข้อนี้คือสาเหตุที่คนติดกันเยอะที่สุด ส่วน cmd เรียก npm.cmd จึงไม่เจอปัญหานี้เลย |
เชื่อมคำสั่งด้วย && |
ใช้ได้ | ใช้ไม่ได้ (ในเวอร์ชัน 5.1 ที่ติดมากับ Windows) | npm init -y && npm install express ที่ลอกมาจากเน็ตจะพัง |
คำสั่งแบบ Mac/Linux (ls, cat, pwd) |
ไม่มี | มีให้ครึ่งๆ | ใช้ ls ได้ แต่พอใส่ option แบบ ls -la กลับพัง → งงหนักกว่าไม่มีเลย |
วิธีดูว่าตอนนี้เปิดตัวไหนอยู่: ถ้าบรรทัดขึ้นต้นด้วย
PS C:\Users\...>= PowerShell (ผิด) ถ้าขึ้นต้นด้วยC:\Users\...>เฉยๆ ไม่มีPS= cmd (ถูกแล้ว)
วิธีเปิด cmd ให้ตรงโฟลเดอร์ที่ต้องการ (ท่าที่สะดวกที่สุด)
เปิด File Explorer ไปที่โฟลเดอร์นั้น → คลิกที่ ช่อง address bar ด้านบน → พิมพ์ cmd แล้วกด Enter
จะได้ cmd ที่อยู่ในโฟลเดอร์นั้นทันที ไม่ต้อง cd เอง
| อยากทำอะไร | Windows (cmd) | macOS (Terminal) |
|---|---|---|
| ดูว่าตอนนี้อยู่โฟลเดอร์ไหน | cd |
pwd |
| เข้าไปในโฟลเดอร์ | cd books-api |
cd books-api |
| ถอยออกมา 1 ชั้น | cd .. |
cd .. |
| ย้ายไปคนละไดรฟ์ | cd /d D:\work |
(ไม่มีไดรฟ์) |
| สร้างโฟลเดอร์ใหม่ | mkdir books-api |
mkdir books-api |
| ดูว่ามีไฟล์อะไรอยู่บ้าง | dir |
ls |
| ล้างจอให้โล่ง | cls |
clear |
สร้างไฟล์เปล่า (เช่น .env) |
type nul > .env |
touch .env |
| เปิดโฟลเดอร์นี้ใน VS Code | code . |
code . |
| หยุด Server ที่รันอยู่ | Ctrl + C |
Ctrl + C |
2 ปุ่มที่ช่วยชีวิต — ใช้ให้ติดเป็นนิสัย
| ปัญหา | วิธีแก้ |
|---|---|
สร้างไฟล์ .env แล้วกลายเป็น .env.txt |
Windows ซ่อนนามสกุลไฟล์ไว้ → เปิด File Explorer แท็บ View ติ๊ก File name extensions หรือสร้างผ่าน cmd ด้วย type nul > .env |
| วางโปรเจคไว้ใน OneDrive/Desktop ที่ sync อยู่ | npm install จะช้ามากหรือ error → ย้ายโปรเจคไปไว้ที่ C:\dev\ |
| ชื่อโฟลเดอร์มีภาษาไทยหรือเว้นวรรค | เลี่ยงไว้ก่อน ใช้ตัวอังกฤษล้วนกับขีดกลาง เช่น books-api |

Boss Battle มี 2 ยก
เปิดเบราว์เซอร์แล้วเข้า URL ทั้ง 3 นี้ พร้อมเปิด DevTools → Network ไว้
| # | URL | จดอะไร |
|---|---|---|
| 1 | https://jsonplaceholder.typicode.com/posts/1 |
Method, Status, Body เป็น Object หรือ Array |
| 2 | https://jsonplaceholder.typicode.com/posts |
Status, ในลิสต์มีกี่รายการ |
| 3 | https://jsonplaceholder.typicode.com/posts/9999 |
Status เป็นเลขอะไร? ทำไม? |
เขียนคำตอบลง note ว่าแต่ละข้อ Server ควรตอบ Status Code อะไร พร้อมเหตุผล 1 บรรทัด
title
ข้อ 1. Status Code หมวด 5xx หมายความว่าอะไร
ข้อ 2. POST /books สร้างหนังสือใหม่สำเร็จ ควรตอบ Status อะไร
ข้อ 3. ผู้ใช้ล็อกอินแล้ว แต่พยายามลบข้อมูลของคนอื่น ควรตอบอะไร
ข้อ 4. ผู้ใช้ส่ง POST มาโดยไม่มีฟิลด์ title ควรตอบอะไร
ข้อ 5. ทำไมการตอบ 200 ทุกกรณี (แม้ตอนเกิด error) ถึงเป็นวิธีที่ไม่ดี
ข้อ 6. GET /posts/9999 ที่ไม่มีข้อมูล ควรได้ Status อะไร