Ответ
Middleware — это функция в Express.js (и других фреймворках Node.js), которая имеет доступ к объектам запроса (req), ответа (res) и следующей функции middleware в стеке (next). Она выполняется в процессе обработки HTTP-запроса и может:
- Выполнять любой код (логирование, аутентификацию).
- Изменять объекты
reqиres(добавлять данные, заголовки). - Завершать цикл запроса-ответа (например, отправив ответ клиенту).
- Вызвать следующую middleware в стеке с помощью
next().
Базовый пример:
// Middleware для логирования времени запроса
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // Передаём управление следующему middleware
});
// Middleware для парсинга JSON-тела запроса (встроенный)
app.use(express.json());
// Маршрут с middleware для проверки аутентификации
app.get('/profile', authMiddleware, (req, res) => {
res.json({ user: req.user }); // req.user был добавлен в authMiddleware
});
Типы middleware в Express:
- Прикладные (Application-level):
app.use()илиapp.METHOD()— выполняются для всех или конкретных маршрутов. - Маршрутные (Router-level): Аналогичны прикладным, но привязаны к экземпляру
express.Router(). - Обработки ошибок: Принимают четыре аргумента
(err, req, res, next). Должны быть объявлены после всех другихapp.use(). - Встроенные (Built-in):
express.json(),express.static(). - Сторонние (Third-party): Пакеты npm, такие как
morganдля логирования,helmetдля безопасности,corsдля управления CORS.
Важно: Порядок объявления middleware критически важен, так как они выполняются последовательно.
Ответ 18+ 🔞
А, ну это же классика, ёпта! Сейчас объясню, что за зверь такой — middleware, чтобы ты сам от себя охуел от простоты.
Представь себе, что твой сервер — это конвейер на заводе, а запрос от клиента — это деталь, которая по нему едет. Middleware — это как рабочие на этом конвейере. Каждый из них может с деталью что-то сделать: посмотреть на неё (логирование), прикрутить к ней болтик (добавить данные в req), сказать «бракованная, нахуй!» и выкинуть её (завершить запрос с ошибкой), или просто передать дальше, крикнув next().
Базовый пример, смотри:
// Этот чувак просто логирует, кто и когда пришёл. Как швейцар в подъезде.
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // Кричит следующему: «На, держи, обрабатывай!»
});
// А этот — умный парсер. Берёт сырой JSON из тела запроса и делает из него нормальный объект.
app.use(express.json());
// А тут маршрут, где стоит охранник (authMiddleware). Без пропуска не пустит.
app.get('/profile', authMiddleware, (req, res) => {
res.json({ user: req.user }); // Охранник уже проверил и прицепил к req.user данные
});
А какие они вообще бывают, эти middleware? Да овердохуища видов!
- Прикладные (Application-level): Это как общие правила на весь завод.
app.use()— для всех,app.METHOD()— для конкретных ворот (маршрутов). - Маршрутные (Router-level): То же самое, но для отдельного цеха (
express.Router()). У них свои порядки. - Обработчики ошибок: Это аварийная бригада. У них аж четыре аргумента
(err, req, res, next). Их ставят в самом конце, чтобы ловить всё, что накосячили предыдущие. Если не поставить — будет тебе хиросима в логах. - Встроенные (Built-in): Это как штатные инструменты:
express.json()(читает JSON),express.static()(раздаёт файлы). Бери и пользуйся. - Сторонние (Third-party): Нанятые спецы из npm. Типа
morgan(логирует красиво),helmet(надевает каску на приложение),cors(разрешает общаться с другими сайтами). Зависимостей потом, правда, будет — хуй с горы.
И главное, чувак, ПОРЯДОК — ВСЁ. Объявляешь их как в очереди: кто первый встал, тот первый и обрабатывается. Если поставишь парсер JSON после своего роутера, который уже пытается читать тело запроса, то будет пизда рулю. Твой роутер получит пустой req.body и будет сидеть, как манда с ушами, ничего не понимая. Так что думай головой, э бошка!