Middleware
Middleware серверной части NocoBase по сути является Middleware Koa. Вы можете использовать объект ctx для обработки запросов и ответов так же, как в Koa. Однако NocoBase работает с логикой на разных бизнес-уровнях, и если размещать все промежуточные обработчики в одном месте, поддерживать их становится сложно.
Поэтому NocoBase делит Middleware на четыре уровня:
-
Middleware уровня источника данных:
app.dataSourceManager.use()
Влияет только на запросы к конкретному источнику данных. Обычно используется для подключений к базе данных, проверки полей и обработки транзакций в рамках этого источника данных. -
Middleware уровня ресурса:
app.resourceManager.use()
Работает только для определенных ресурсов. Подходит для логики уровня ресурса: проверка прав доступа к данным, форматирование и т.д. -
Middleware уровня разрешений:
app.acl.use()
Выполняется перед проверкой разрешений и используется для проверки ролей и прав пользователя. -
Middleware уровня приложения:
app.use()
Выполняется для каждого запроса. Подходит для логирования, общей обработки ошибок и формирования ответов.
Регистрация Middleware
Middleware обычно регистрируется в методе load плагина, например:
Порядок выполнения
Порядок выполнения Middleware следующий:
- Сначала выполняется Middleware разрешений, добавленное через
acl.use(). - Затем выполняется Middleware ресурса, добавленное через
resourceManager.use(). - Затем выполняется Middleware источника данных, добавленное через
dataSourceManager.use(). - В конце выполняется Middleware приложения, добавленное через
app.use().
Механизм вставки before / after / tag
Для гибкого управления порядком Middleware NocoBase предоставляет параметры before, after и tag:
tag: помечает Middleware для использования в последующих обработчиках.before: вставляет обработчик перед Middleware с указанным тегом.after: вставляет обработчик после Middleware с указанным тегом.
Пример:
Если позиция не указана, порядок выполнения по умолчанию для нового Middleware такой:
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
Пример луковой модели
Порядок выполнения Middleware соответствует луковой модели Koa: первым происходит вход в стек, последним — выход из него.
Примеры вывода для разных маршрутов:
-
Обычный запрос:
/api/helloВывод:[1,2](ресурс не определен, поэтому MiddlewareresourceManagerиaclне выполняется) -
Запрос ресурса:
/api/test:listВывод:[5,3,7,1,2,8,4,6]Middleware выполняется в соответствии с порядком слоев и луковой моделью.
Краткое содержание
- Middleware NocoBase расширяет Middleware Koa.
- Доступны четыре уровня: приложение -> источник данных -> ресурс -> разрешения.
- Для гибкого управления порядком выполнения можно использовать
before/after/tag. - Выполнение следует луковой модели Koa и поддерживает композицию и вложенность Middleware.
- Middleware уровня источника данных влияет только на запросы к конкретному источнику, а уровня ресурса — только на запросы к конкретному ресурсу.

