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