[JSxTS] ทำ Middleware สำหรับ Express.js ให้รับ Parameters ได้

มาทำให้ Middleware สำหรับ Express.js ให้รับ Parameters ได้ แล้วเราจะได้ Reuse Middleware ได้แบบสบาย ๆ เลย

Siwawes Wongcharoen
2 min readJun 10, 2022

ก่อนที่จะรู้วิธีนี้ ก็ใช้วิธีเขียน Function Middleware 1 ตัว เพื่อทำงานเฉพาะ จนเมื่อมารู้ว่า ถ้าอยากจะทำให้ Middleware สามารถ Reuse ได้ง่าย ๆ ผ่านทาง Parameters ที่เรากำหนดเองได้ เพราะจากเดิมต้องเขียน Middleware เป็น 10 ตัว แต่ตอนนี้เหลือแค่ไม่กี่ตัว ก็เพียงพอแล้ว

โอ้ นี่มันสวรรค์ชัด ๆ

Middleware ที่รับ Parameters ได้

เล่าปัญหาก่อน

จากตัวอย่างในภาพนี้ จะมี Role อยู่ 3 Roles คือ ADMIN, PARTNER และ CUSTOMER

ต้องการกำหนด ว่า API ไหน จะต้องการ Role ไหนบ้าง ถึงจะทำงานได้ หากเราคิดง่าย ๆ จะต้องมี ถึง 7 ที่แบบเป็นไปได้ คือ

  1. ADMIN => requireAdmin
  2. PARTNER => requirePartner
  3. CUSTOMER => requireCustomer
  4. ADMIN, PARTNER => requireAdminAndPartner
  5. ADMIN, CUSTOMER => requireAdminAndCustomer
  6. PARTNER, CUSTOMER => requirePartnerAndCustomer
  7. 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 ก็ได้นี่นา)

กราบงาม ๆ ให้ Agam Banga

เลยนึกได้ว่า เฮ้ย นี่เราอยู่ในโลกของ JS นะ เราลืมวิธีนี้ไปได้ยังไง เราสามารถ สร้าง Function ที่มี Signature แบบนึง แล้วให้ Return ออกมาเป็น Function ที่มี Signature อีกแบบนึงได้

ลงมือทำ

พอรู้วิธีสร้าง Middlewareให้รับ Parameters ได้แล้ว ขั้นต่อไปคือ ลงมือทำ

จบใน 1 Function จากที่ต้องใช้ถึง 7+1 Functions

สรุปสิ่งที่เรียนรู้มา

  • JS แม่ม
  • Source code มีให้ดูเยอะแยะ อย่ามองข้าม
  • ไม่ต้องขยันกับสิ่งโง่ ๆ มากนัก

--

--

No responses yet