แยก req.params, req.query และ req.body ใน Express ให้ถูกหน้าที่
เลือกช่องทางรับข้อมูลตามความหมายของ URL การกรอง และ payload พร้อม validate ทุกจุด เพื่อให้ API อ่านง่ายและลดความสับสนระหว่าง frontend กับ backend

ภาพรวม
req.params, req.query, req.body คือคนละช่องทางของข้อมูล 📦
Express รับข้อมูลจาก request ได้หลายที่ แต่ละที่มีความหมายต่างกัน ถ้าใช้ปนกัน API จะอ่านยากและ frontend เดาไม่ออก
req.params มาจาก path parameter เหมาะกับข้อมูลที่เป็นตัวระบุ resource เช่น /users/:id หรือ /orders/:orderId
app.get("/users/:id", (req, res) => { console.log(req.params.id) })
req.query มาจาก query string หลังเครื่องหมาย ? เหมาะกับ filter, sort, pagination เช่น /users?page=2&role=admin
app.get("/users", (req, res) => { console.log(req.query.page) })
req.body คือข้อมูลใน body ของ request ใช้กับ POST, PUT, PATCH เช่นชื่อผู้ใช้ email password หรือ payload ตอนสร้างข้อมูล
app.post("/users", (req, res) => { console.log(req.body.email) })
ก่อนอ่าน req.body ต้องมี middleware parse body เช่น app.use(express.json()) ไม่งั้น body อาจเป็น undefined หรืออ่านไม่ได้ตามที่คาด
วิธีจำง่าย ๆ params = ชี้ว่ากำลังพูดถึง resource ไหน query = ปรับวิธีค้นหาหรือแสดงผล body = ส่งข้อมูลหลักเพื่อสร้างหรือแก้
อย่าใส่ข้อมูลลับใน query เพราะ URL อาจไปอยู่ใน log, browser history หรือ analytics token และ password ไม่ควรโผล่ใน query string
ถ้า API ออกแบบดี คนอ่าน URL ก็พอเดา intent ได้ และ backend ก็ validate แต่ละช่องทางได้ชัดขึ้น 🔎
แนวทางนำไปใช้
- นำแนวคิดจากโพสต์นี้ไปทดลองกับงานจริงของคุณ
- แยกเป็นขั้นตอนเล็ก ๆ แล้วทำทีละส่วน
- บันทึกผลลัพธ์และสิ่งที่เรียนรู้เพื่อต่อยอด
สรุป
เลือกช่องทางรับข้อมูลตามความหมายของ URL การกรอง และ payload พร้อม validate ทุกจุด เพื่อให้ API อ่านง่ายและลดความสับสนระหว่าง frontend กับ backend