logologo
Початок
Посібник
Розробка
Плагіни
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Початок
Посібник
Розробка
Плагіни
API
logologo

Швидкий старт

Огляд розробки плагінів
Написання першого плагіна
Структура каталогу проєкту

Серверна розробка

Огляд
Плагін (Plugin)
Колекції (таблиці даних)
Операції з базою даних (Database)
Керування джерелами даних (DataSourceManager)
Керування ресурсами (ResourceManager)
Контроль доступу (ACL)
Проміжне ПЗ (Middleware)
Кеш (Cache)
Подія (Event)
Контекст запиту (Context)
Скрипт оновлення (Migration)
Логи (Logger)
Інтернаціоналізація (I18n)
Командний рядок (Command)
Керування завданнями за розкладом (CronJobManager)
Тестування (Test)

Клієнтська розробка

Огляд
Плагін (Plugin)
Контекст (Context)
Маршрутизатор (Router)
Контроль доступу (ACL)
Керування джерелами даних (DataSourceManager)
Ресурс (Resource)
Запит (Request)
Стилі та теми (Styles & Themes)
Логи (Logger)
Інтернаціоналізація (I18n)
Тестування (Test)

Інше

Посібник з оновлення плагінів
Список мов
Керування залежностями
Збірка
Previous PageКонтроль доступу (ACL)
Next PageКеш (Cache)
Повідомлення про переклад ШІ

Ця документація була автоматично перекладена штучним інтелектом.

#Мідлвер

Мідлвер NocoBase Server по суті є мідлвером Koa. Ви можете працювати з об'єктом ctx для обробки запитів та відповідей, як і в Koa. Однак, оскільки NocoBase має керувати логікою на різних бізнес-рівнях, якщо весь мідлвер розмістити разом, його буде дуже важко підтримувати та керувати ним.

З цієї причини NocoBase розділяє мідлвер на чотири рівні:

  1. Мідлвер рівня джерела даних: app.dataSourceManager.use() Він впливає лише на запити для конкретного джерела даних і зазвичай використовується для логіки підключення до бази даних, перевірки полів або обробки транзакцій для цього джерела даних.

  2. Мідлвер рівня ресурсу: app.resourceManager.use() Він діє лише для визначених ресурсів (Resource) і підходить для обробки логіки на рівні ресурсу, такої як дозволи на дані, форматування тощо.

  3. Мідлвер рівня дозволів: app.acl.use() Виконується перед перевірками дозволів і використовується для перевірки дозволів або ролей користувачів.

  4. Мідлвер рівня застосунку: 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();
    });

  }
}

#Порядок виконання

Порядок виконання мідлвера такий:

  1. Спочатку виконується мідлвер дозволів, доданий за допомогою acl.use().
  2. Потім виконується мідлвер ресурсів, доданий за допомогою resourceManager.use().
  3. Потім виконується мідлвер джерел даних, доданий за допомогою dataSourceManager.use().
  4. Нарешті, виконується мідлвер застосунку, доданий за допомогою 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, забезпечуючи компонованість та вкладеність мідлвера.
  • Мідлвер рівня джерела даних впливає лише на запити до вказаного джерела даних, а мідлвер рівня ресурсу — лише на запити до визначених ресурсів.