מסמך זה תורגם על ידי בינה מלאכותית. לכל אי דיוק, אנא עיין בגרסה האנגלית
התווכה (Middleware) בשרת NocoBase היא למעשה תווכה של Koa. באפשרותכם לתפעל את אובייקט ה-ctx כדי לטפל בבקשות ובתגובות, בדיוק כמו ב-Koa. אך מכיוון ש-NocoBase צריכה לנהל לוגיקה בשכבות עסקיות שונות, אם כל התווכות ימוקמו יחד, יהיה קשה מאוד לתחזק ולנהל אותן.
לשם כך, NocoBase מחלקת את התווכה לארבע רמות:
תווכה ברמת מקור נתונים: app.dataSourceManager.use()
פועלת רק על בקשות עבור מקור נתונים ספציפי, ומשמשת בדרך כלל ללוגיקה של חיבורי מסד נתונים, אימות שדות או טיפול בטרנזקציות עבור אותו מקור נתונים.
תווכה ברמת משאב: app.resourceManager.use()
חלה רק על משאבים מוגדרים (Resource), ומתאימה לטיפול בלוגיקה ברמת משאב, כגון הרשאות נתונים, עיצוב ועוד.
תווכה ברמת הרשאות: app.acl.use()
מבוצעת לפני בדיקות הרשאות, ומשמשת לאימות הרשאות משתמש או תפקידים.
תווכה ברמת יישום: app.use()
מבוצעת עבור כל בקשה, ומתאימה לרישום יומן (logging), טיפול כללי בשגיאות, עיבוד תגובות ועוד.
תווכה נרשמת בדרך כלל במתודת ה-load של התוסף, לדוגמה:
סדר ביצוע התווכה הוא כדלקמן:
acl.use().resourceManager.use().dataSourceManager.use().app.use().כדי לשלוט בצורה גמישה יותר בסדר התווכה, NocoBase מספקת את הפרמטרים before, after ו-tag:
דוגמה:
אם לא צוין מיקום, סדר הביצוע ברירת המחדל עבור תווכות חדשות הוא:
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
סדר ביצוע התווכה עוקב אחר מודל הבצל של Koa, כלומר, התווכות נכנסות למחסנית התווכה ראשונות ויוצאות אחרונות.
דוגמאות לפלט עבור ממשקים שונים:
בקשה רגילה: /api/hello
פלט: [1,2] (משאב לא מוגדר, לא מבוצעות תווכות resourceManager ו-acl)
בקשת משאב: /api/test:list
פלט: [5,3,7,1,2,8,4,6]
התווכה מבוצעת לפי סדר השכבות ומודל הבצל.
before / after / tag כדי לשלוט באופן גמיש בסדר הביצוע.