Middleware (Промежуточная обработка)
Middleware позволяют добавлять обработку для запроса и ответа и динамически внедрять дополнительное поведение при каждом обращении к странице или эндпоинту.
В том числе, с помощью этого подхода можно устанавливать и использовать специфичную для запроса информацию (контекст) между различными эндпоинтами и страницами, мутируя locals
объект, который доступен во всех Astro компонентах и API эндпоинтах.
В Astro middleware доступны как в SSG, так и в SSR подходе.
Использование
-
Создайте
src/middleware.js|ts
(илиsrc/middleware/index.js|ts
). -
Внутри этого модуля необходимо экспортировать
onRequest()
функцию. Это не должен быть экспорт по умолчанию. -
Внутри
.astro
компонентов, можно получить доступ к данным черезAstro.locals
.
Типы middleware
Вы можете импортировать и использовать утилитную функцию defineMiddleware()
для того, чтобы получить проверку типов:
Или, если вы используете JsDoc для проверки типов, вы можете использовать MiddlewareRequestHandler
:
Для того чтобы типизировать данные внутри Astro.locals
(это позволит использовать автодополнение IDE в .astro
файлах и внутри middleware), определите глобальную область имён в env.d.ts
файле:
Затем, внутри middleware файла, активируются инструменты автодополнения и проверки типов.
Вы можете хранить любые типы данных внутри Astro.locals
: строки, числа и даже сложные структуры данных, такие как функции и Maps.
После этого вы можете использовать эту информацию внутри любых .astro
файлов.
Пример: цензурирование персональных данных
Пример ниже использует middleware для того, чтобы заменить персональные данные на странице (“ПД”) словосочетанием “Совершенно секретно”:
Цепочки middleware
Несколько middleware могут быть объединены в указанном порядке с помощью функции sequence()
:
Это приведет к такому порядку в консоли:
Описание API
onRequest()
Обязательный экспорт функции из src/middleware.js|ts
, который будет вызван перед обработкой любой страницы или API роута. Эта функции принимает 2 необязательных аргумента: context и next(). onRequest()
обязан вернуть объект типа Response
: явно, или используя вызов next()
.
context
Объект, который включает всю информацию, которая доступна другим middleware, API роутам или компонентам .astro
в процессе обработки запроса.
Это необязательный аргумент функции onRequest()
, который может так же содержать объект locals
как дополнительные атрибуты для общего доступа в процессе отрисовки. Например, объект context
может содержать cookies, используемые для аутентификации.
Это тот же самый объект context
(EN), который используется в API роутах.
next()
Это функция, которая добавляет обработку (чтение и запись) Response
или вызывает next
цепочки middleware и возвращает Response
. Например, в ней может модифицироваться body HTML документа в ответе.
Это необязательный аргумент функции onRequest()
, и может содержать обязательный Response
, возвращаемый из middleware.
locals
Объект, который содержит данные из Response
. Ими можно манипулировать в middleware.
locals
объект передаётся через процесс обработки запроса и доступен через свойства объектов APIContext
(EN) и AstroGlobal
. Это позволяет иметь общий доступ к данным как внутри middleware, так и в API роутах или .astro
страницах. Это удобно, когда нужно сохранить специфичные для текущего запроса данные, например, инфо о пользователе.
locals
- это объект, который живет в контексте запроса, т.е. когда страница отрисовалась, locals
перестаёт существовать. Для последующего запроса будет создан новый locals
. Данные, которые должны сохраняться между разными страницами и запросами должны быть сохранены в другом месте.
Значение объекта locals
не может быть перезаписано в рантайме. Используя такой подход, есть риск стереть всю информацию, которая была сохранена пользователем. В dev
режиме, Astro
выполняет проверки и может выбросить исключение, если locals
перезаписывается.
sequence()
Функция, которая принимает набор middleware реализаций в качестве аргументов. В рантайме она будет выполнять их в порядке регистрации.
createContext
Низкоуровненый API для создания APIContext
(EN), который может использоваться внутри middleware Astro.
Эта функция может использоваться для интеграций/адаптеров для явного программного вызова middleware.
trySerializeLocals
Низкоуровневый API который принимает любое значение и пытается сериализовать его в строку. Если значение не может быть сериализовано, то функция выбросил исключение в рантайме.
Learn