[JSxTS] ทำ Middleware สำหรับ Express.js ให้รับ Parameters ได้
มาทำให้ Middleware สำหรับ Express.js ให้รับ Parameters ได้ แล้วเราจะได้ Reuse Middleware ได้แบบสบาย ๆ เลย
ก่อนที่จะรู้วิธีนี้ ก็ใช้วิธีเขียน Function Middleware 1 ตัว เพื่อทำงานเฉพาะ จนเมื่อมารู้ว่า ถ้าอยากจะทำให้ Middleware สามารถ Reuse ได้ง่าย ๆ ผ่านทาง Parameters ที่เรากำหนดเองได้ เพราะจากเดิมต้องเขียน Middleware เป็น 10 ตัว แต่ตอนนี้เหลือแค่ไม่กี่ตัว ก็เพียงพอแล้ว
โอ้ นี่มันสวรรค์ชัด ๆ
เล่าปัญหาก่อน
จากตัวอย่างในภาพนี้ จะมี Role อยู่ 3 Roles คือ ADMIN, PARTNER และ CUSTOMER
ต้องการกำหนด ว่า API ไหน จะต้องการ Role ไหนบ้าง ถึงจะทำงานได้ หากเราคิดง่าย ๆ จะต้องมี ถึง 7 ที่แบบเป็นไปได้ คือ
- ADMIN => requireAdmin
- PARTNER => requirePartner
- CUSTOMER => requireCustomer
- ADMIN, PARTNER => requireAdminAndPartner
- ADMIN, CUSTOMER => requireAdminAndCustomer
- PARTNER, CUSTOMER => requirePartnerAndCustomer
- ADMIN, PARTNER, CUSTOMER => requireAdminPartnerAndCustomer
ก่อนที่จะรู้วิธีสร้าง Middlewareให้รับ Parameters ได้ จะต้องสร้าง Middleware ขึ้นมา 7 ตัว เพื่อให้รับการทำงานทั้งหมดที่เป็นไปได้ ถึงแม้ว่าเบื้องหลังของ Middleware 7 ตัวนี้ จะเขียนเป็น Function ได้ก็ตาม
ซึ่งตอนแรกก็ยังคิดว่า ถ้าสามารถ เขียน Middleware ตัวเดียว แต่ให้รับ Parameters ได้ มันก็น่าจะดีกว่านะ แต่ก็ยังติดปัญหาว่า ตัว Handlers ของ Express.js มันจะรับ อะไรที่หน้าตาประมาณนี้เท่านั้น
function (req: Request, res: Response, next: Function)
แต่พอเห็นวิธีใช้งาน cors ก็อ่ะ ถ้าเค้าทำแบบนี้ได้ เราก็น่าจะทำแบบนี้ได้เหมือนกันนี่นา
app.use(cors(option))
จึงลงมือ Search หาดูว่าเค้าทำอย่างไร จนไปเจอที่ StackOverflow (กราบงาม ๆ) ก็พบกับสิ่งนี้ (เอาจริง ๆ มานึกได้ทีหลังว่า เราเข้าไปดู Source code ของ cors ก็ได้นี่นา)
เลยนึกได้ว่า เฮ้ย นี่เราอยู่ในโลกของ JS นะ เราลืมวิธีนี้ไปได้ยังไง เราสามารถ สร้าง Function ที่มี Signature แบบนึง แล้วให้ Return ออกมาเป็น Function ที่มี Signature อีกแบบนึงได้
ลงมือทำ
พอรู้วิธีสร้าง Middlewareให้รับ Parameters ได้แล้ว ขั้นต่อไปคือ ลงมือทำ
จบใน 1 Function จากที่ต้องใช้ถึง 7+1 Functions
สรุปสิ่งที่เรียนรู้มา
- JS แม่ม
- Source code มีให้ดูเยอะแยะ อย่ามองข้าม
- ไม่ต้องขยันกับสิ่งโง่ ๆ มากนัก