Что такое middleware — прослойка, через которую проходит каждый запрос

Ты добавил в приложение вход. И вдруг понимаешь: проверять «а залогинен ли пользователь?» надо не на одной странице, а на десяти. Дублировать эту проверку в каждом обработчике — путь к боли: забудешь в одном месте, и там дыра.
Вот тут и появляется слово, которое советует любой ИИ-помощник: «добавь middleware». Звучит как жаргон для взрослых, а на деле это простая идея — прослойка, через которую проходит каждый запрос до того, как до него доберётся твой основной код. Написал проверку один раз — работает везде. Разберёмся.
Что такое middleware простыми словами
Middleware (по-русски иногда «промежуточное ПО») — это код, который стоит между приходом запроса и твоим обработчиком, который на этот запрос отвечает.
Представь запрос как посылку, которая едет к получателю по конвейеру. Прежде чем попасть к адресату, посылка проезжает через несколько станций: на одной сверяют пропуск, на другой ставят штамп в журнал, на третьей проверяют упаковку. Каждая станция — это middleware. Твой обработчик — конечный получатель в конце ленты.
Ключевая мысль: middleware видит любой запрос, который через него проходит. Поэтому всё, что нужно делать «для всех», кладут именно сюда — а не копируют в каждый маршрут API по отдельности.
Конвейер: как запрос проходит через прослойки
Путь одного запроса выглядит так:
- запрос приходит на сервер;
- проходит первую прослойку — например, запись в лог: «кто, куда, когда»;
- проходит вторую — проверку авторизации: «этот пользователь вообще имеет право сюда?»;
- если всё ок — попадает в твой обработчик, который делает саму работу и готовит ответ;
- ответ едет назад, иногда снова через прослойки.
Важное свойство: любая прослойка может остановить конвейер. Если проверка авторизации решила «нет, ты не вошёл» — она сразу возвращает ошибку 401, и до твоего обработчика запрос вообще не доедет. Экономит и время, и защищает: плохой запрос отсеивается на входе.
Что обычно кладут в middleware
Всё, что должно применяться ко многим запросам одинаково:
- Авторизация — проверить токен или сессию, отсечь чужих ещё на входе.
- Логирование — записать каждый запрос, чтобы потом было что смотреть при разборе.
- CORS — те самые разрешающие заголовки, чтобы браузер отдал ответ твоему фронтенду.
- Разбор тела запроса — превратить сырой текст запроса в удобный объект (например, JSON).
- Лимиты — не пускать одного клиента слать тысячу запросов в секунду.
Смысл один: написал логику один раз в прослойке — и она работает на всех маршрутах разом. Захотел добавить вход по всему приложению — это одна middleware, а не правка сотни файлов.
Порядок важен — и зачем next()
Прослойки выполняются по очереди, сверху вниз, и порядок решает всё. Логин раньше разбора тела? Тогда чужой запрос отсечётся до того, как ты потратишь силы на его разбор. Перепутал порядок — можешь, наоборот, обрабатывать то, что должен был выкинуть.
Как прослойка передаёт запрос дальше по конвейеру? Специальной командой — в Express она называется next(). Буквально: «я своё сделала, передай следующей станции». Забыл вызвать next() — и запрос застрял на этой прослойке навсегда: клиент видит вечную загрузку, потому что до ответа дело не дошло. Это, кстати, частая причина «запрос висит и ничего не происходит».
Частые вопросы
Middleware — это только про бэкенд?
Чаще всего да — прослойки на сервере обрабатывают входящие запросы. Но идея шире: похожий приём есть во фронтенд-фреймворках (перехват переходов между страницами) и в инструментах вроде Redux. Общий смысл везде один — код, который встаёт «посередине» потока и что-то с ним делает по пути.
Чем middleware отличается от обычной функции?
Обычную функцию ты вызываешь сам, когда она нужна. Middleware вызывает не ты, а фреймворк — автоматически, для каждого проходящего запроса, в заданном порядке. Ты только регистрируешь её в конвейере, а дальше она срабатывает сама.
Зачем это новичку, если фреймворк уже всё умеет?
Затем, что «магия» перестаёт быть магией. Когда поймёшь, что запрос — это конвейер из прослоек, тебе станут понятны и советы ИИ («добавь auth middleware»), и странные баги вроде «запрос висит» (забыл next()) или «CORS не работает» (прослойка стоит не в том порядке).
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





