Express в деталях: маршрутизация и middleware
Как запрос на самом деле проходит через приложение - и как управлять этим путём
app.get и app.use, и всё работало. Теперь заглянем под капот. Приложение Express - это на самом деле конвейер: каждый запрос проходит через упорядоченный список функций - middleware и обработчиков маршрутов - пока одна из них не отправит ответ или не будет выброшена ошибка. Освойте порядок этого конвейера, и вы управляете всем: аутентификацией, логированием, разбором тела, маршрутизацией и обработкой ошибок.
- объяснить цепочку middleware и точную задачу
next(), - чётко понимать, почему важен порядок регистрации,
- разбивать маршруты на модульные файлы с помощью
express.Router(), - читать параметры маршрута, включая множественные и необязательные,
- писать централизованный обработчик ошибок (middleware с четырьмя аргументами).
1. Конвейер запроса
Каждая функция, которую вы регистрируете через app.use, app.get, app.post и подобные, добавляется в единый упорядоченный стек. Когда приходит запрос, Express проходит этот стек сверху вниз, выполняя каждую функцию, чей путь и метод совпадают. Функция, получившая управление, может продолжить ровно тремя способами:
- Отправить ответ - вызвать
res.send,res.json,res.endи т. д. Конвейер останавливается; ничего ниже не выполняется. - Вызвать
next()- передать управление следующей подходящей функции в стеке. - Вызвать
next(err)- сразу перейти к обработчику ошибок (об этом в разделе 5).
Обычная функция middleware имеет сигнатуру (req, res, next). Обработчик маршрута - это просто middleware, привязанный к конкретному методу и пути. Это самая важная ментальная модель в Express: никакой магии, только упорядоченный список функций.
Аналогия. Представьте сборочный конвейер на фабрике. Деталь (запрос) едет по ленте мимо ряда станций (middleware). Каждая станция может осмотреть или изменить деталь и отправить её дальше через next(), либо вообще снять с ленты, отгрузив готовый продукт (res.send). Если станция обнаружила брак, она сбрасывает деталь в жёлоб для отбраковки - это next(err), и этот жёлоб ведёт к одной особой станции: обработчику ошибок.