เอกสารนี้แปลโดย AI หากมีข้อมูลที่ไม่ถูกต้อง โปรดดูเวอร์ชันภาษาอังกฤษ
มิดเดิลแวร์ของ NocoBase Server นั้น โดยพื้นฐานแล้วคือ Koa มิดเดิลแวร์ ครับ/ค่ะ คุณสามารถจัดการอ็อบเจกต์ ctx เพื่อประมวลผลคำขอและการตอบกลับได้เหมือนกับการใช้งานใน Koa เลยครับ/ค่ะ แต่เนื่องจาก NocoBase ต้องจัดการตรรกะในเลเยอร์ธุรกิจที่แตกต่างกัน หากมิดเดิลแวร์ทั้งหมดถูกรวมไว้ด้วยกัน จะทำให้การบำรุงรักษาและการจัดการทำได้ยากมากครับ/ค่ะ
ด้วยเหตุนี้ NocoBase จึงแบ่งมิดเดิลแวร์ออกเป็น สี่ระดับ ดังนี้ครับ/ค่ะ
มิดเดิลแวร์ระดับแหล่งข้อมูล (Data Source Level Middleware): app.dataSourceManager.use()
มีผลเฉพาะกับคำขอของ แหล่งข้อมูลใดแหล่งข้อมูลหนึ่ง เท่านั้น มักใช้สำหรับตรรกะที่เกี่ยวข้องกับการเชื่อมต่อฐานข้อมูล การตรวจสอบความถูกต้องของฟิลด์ หรือการจัดการธุรกรรมสำหรับแหล่งข้อมูลนั้นๆ ครับ/ค่ะ
มิดเดิลแวร์ระดับทรัพยากร (Resource Level Middleware): app.resourceManager.use()
มีผลเฉพาะกับทรัพยากร (Resource) ที่ถูกกำหนดไว้แล้ว เหมาะสำหรับการจัดการตรรกะระดับทรัพยากร เช่น สิทธิ์การเข้าถึงข้อมูล การจัดรูปแบบ เป็นต้น ครับ/ค่ะ
มิดเดิลแวร์ระดับสิทธิ์ (Permission Level Middleware): app.acl.use()
ทำงานก่อนการตรวจสอบสิทธิ์ ใช้เพื่อยืนยันสิทธิ์หรือบทบาทของผู้ใช้ครับ/ค่ะ
มิดเดิลแวร์ระดับแอปพลิเคชัน (Application Level Middleware): app.use()
จะทำงานกับทุกๆ คำขอ เหมาะสำหรับการบันทึก Log, การจัดการข้อผิดพลาดทั่วไป, การประมวลผลการตอบกลับ เป็นต้น ครับ/ค่ะ
โดยทั่วไปแล้ว มิดเดิลแวร์จะถูกลงทะเบียนในเมธอด load ของปลั๊กอินครับ/ค่ะ ตัวอย่างเช่น:
ลำดับการทำงานของมิดเดิลแวร์มีดังนี้ครับ/ค่ะ
acl.use() จะทำงานก่อนresourceManager.use() จะทำงานdataSourceManager.use() จะทำงานapp.use() จะทำงานbefore / after / tagเพื่อให้ควบคุมลำดับของมิดเดิลแวร์ได้อย่างยืดหยุ่นมากขึ้น NocoBase มีพารามิเตอร์ before, after และ tag ให้ใช้งานครับ/ค่ะ
ตัวอย่าง:
หากไม่ได้ระบุตำแหน่ง มิดเดิลแวร์ที่เพิ่มเข้ามาใหม่จะมีลำดับการทำงานเริ่มต้นดังนี้ครับ/ค่ะ
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
ลำดับการทำงานของมิดเดิลแวร์เป็นไปตาม โมเดล Onion ของ Koa ครับ/ค่ะ ซึ่งหมายความว่าจะเข้าสู่ Stack ของมิดเดิลแวร์ก่อน และออกจาก Stack เป็นลำดับสุดท้าย
ตัวอย่างลำดับการแสดงผลเมื่อเข้าถึง API ที่แตกต่างกัน:
คำขอทั่วไป: /api/hello
ผลลัพธ์: [1,2] (ไม่ได้กำหนดทรัพยากร จึงไม่ทำงาน resourceManager และ acl มิดเดิลแวร์)
คำขอทรัพยากร: /api/test:list
ผลลัพธ์: [5,3,7,1,2,8,4,6]
มิดเดิลแวร์จะทำงานตามลำดับชั้นและโมเดล Onion
before / after / tag เพื่อควบคุมลำดับการทำงานได้อย่างยืดหยุ่น