Повідомлення про переклад ШІ
Ця документація була автоматично перекладена штучним інтелектом.
Мідлвер
Мідлвер NocoBase Server по суті є мідлвером Koa. Ви можете працювати з об'єктом ctx для обробки запитів та відповідей, як і в Koa. Однак, оскільки NocoBase має керувати логікою на різних бізнес-рівнях, якщо весь мідлвер розмістити разом, його буде дуже важко підтримувати та керувати ним.
З цієї причини NocoBase розділяє мідлвер на чотири рівні:
-
Мідлвер рівня джерела даних: app.dataSourceManager.use()
Він впливає лише на запити для конкретного джерела даних і зазвичай використовується для логіки підключення до бази даних, перевірки полів або обробки транзакцій для цього джерела даних.
-
Мідлвер рівня ресурсу: app.resourceManager.use()
Він діє лише для визначених ресурсів (Resource) і підходить для обробки логіки на рівні ресурсу, такої як дозволи на дані, форматування тощо.
-
Мідлвер рівня дозволів: app.acl.use()
Виконується перед перевірками дозволів і використовується для перевірки дозволів або ролей користувачів.
-
Мідлвер рівня застосунку: app.use()
Виконується для кожного запиту і підходить для ведення журналів, загальної обробки помилок, обробки відповідей тощо.
Реєстрація мідлвера
Мідлвер зазвичай реєструється в методі load плагіна, наприклад:
export class MyPlugin extends Plugin {
load() {
// Мідлвер рівня застосунку
this.app.use(async (ctx, next) => {
console.log('App middleware');
await next();
});
// Мідлвер джерела даних
this.app.dataSourceManager.use(async (ctx, next) => {
console.log('DataSource middleware');
await next();
});
// Мідлвер дозволів
this.app.acl.use(async (ctx, next) => {
console.log('ACL middleware');
await next();
});
// Мідлвер ресурсу
this.app.resourceManager.use(async (ctx, next) => {
console.log('Resource middleware');
await next();
});
}
}
Порядок виконання
Порядок виконання мідлвера такий:
- Спочатку виконується мідлвер дозволів, доданий за допомогою
acl.use().
- Потім виконується мідлвер ресурсів, доданий за допомогою
resourceManager.use().
- Потім виконується мідлвер джерел даних, доданий за допомогою
dataSourceManager.use().
- Нарешті, виконується мідлвер застосунку, доданий за допомогою
app.use().
Механізм вставки before / after / tag
Для більш гнучкого контролю порядку мідлвера NocoBase надає параметри before, after та tag:
- tag: Позначає мідлвер для посилання на нього наступними мідлверами.
- before: Вставляє перед мідлвером із зазначеним тегом.
- after: Вставляє після мідлвера із зазначеним тегом.
Приклад:
// Звичайний мідлвер
app.use(m1, { tag: 'restApi' });
app.resourceManager.use(m2, { tag: 'parseToken' });
app.resourceManager.use(m3, { tag: 'checkRole' });
// m4 буде розміщено перед m1
app.use(m4, { before: 'restApi' });
// m5 буде вставлено між m2 та m3
app.resourceManager.use(m5, { after: 'parseToken', before: 'checkRole' });
TIP
Якщо не вказано позицію, порядок виконання для новододаного мідлвера за замовчуванням такий:
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
Приклад моделі цибулевого кільця
Порядок виконання мідлвера відповідає моделі цибулевого кільця Koa, тобто спочатку входить у стек мідлвера, а потім виходить з нього.
app.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(1);
await next();
ctx.body.push(2);
});
app.resourceManager.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(3);
await next();
ctx.body.push(4);
});
app.acl.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(5);
await next();
ctx.body.push(6);
});
app.resourceManager.define({
name: 'test',
actions: {
async list(ctx, next) {
ctx.body = ctx.body || [];
ctx.body.push(7);
await next();
ctx.body.push(8);
},
},
});
Приклади порядку виводу для різних інтерфейсів:
-
Звичайний запит: /api/hello
Вивід: [1,2] (ресурс не визначено, мідлвер resourceManager та acl не виконується)
-
Запит ресурсу: /api/test:list
Вивід: [5,3,7,1,2,8,4,6]
Мідлвер виконується відповідно до порядку рівнів та моделі цибулевого кільця.
Підсумок
- Мідлвер NocoBase є розширенням мідлвера Koa.
- Чотири рівні: Застосунок -> Джерело даних -> Ресурс -> Дозволи.
- Можна використовувати
before / after / tag для гнучкого контролю порядку виконання.
- Дотримується моделі цибулевого кільця Koa, забезпечуючи компонованість та вкладеність мідлвера.
- Мідлвер рівня джерела даних впливає лише на запити до вказаного джерела даних, а мідлвер рівня ресурсу — лише на запити до визначених ресурсів.