Что такое middleware в контексте Node.js/Express?

«Что такое middleware в контексте Node.js/Express?» — вопрос из категории Express, который задают на 45% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Middleware — это функция в Express.js (и других фреймворках Node.js), которая имеет доступ к объектам запроса (req), ответа (res) и следующей функции middleware в стеке (next). Она выполняется в процессе обработки HTTP-запроса и может:

  1. Выполнять любой код (логирование, аутентификацию).
  2. Изменять объекты req и res (добавлять данные, заголовки).
  3. Завершать цикл запроса-ответа (например, отправив ответ клиенту).
  4. Вызвать следующую 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 критически важен, так как они выполняются последовательно.