ENIGMA AI
ENIGMA AI

Какие бывают виды middleware в Express.js и какие существуют альтернативы morgan?

встречается 1× Express.js middle web

Как ответить

В Express.js middleware — это функции, которые имеют доступ к объектам запроса (req), ответа (res) и следующей функции в цепочке (next). По способу подключения их делят на application-level, router-level, error-handling, built-in и third-party. По назначению — логирование, парсинг тела, CORS, статика, аутентификация и т.д. Альтернативы morgan обычно нужны, когда требуется больше гибкости в формате или производительности.

Виды middleware

  • Application-level — подключаются через app.use() или app.METHOD() (GET, POST и т.д.). Выполняются для всех маршрутов или конкретного пути.
  • Router-level — то же самое, но через express.Router(). Позволяет группировать middleware для подмодулей.
  • Error-handling — четыре параметра: (err, req, res, next). Должны быть объявлены последними. Express автоматически передаёт ошибку, если в предыдущей middleware вызван next(err).
  • Built-in — встроенные: express.json(), express.urlencoded(), express.static(). Начиная с Express 4.16+ они снова часть ядра (ранее подключались через body-parser).
  • Third-party — сторонние пакеты вроде cors, helmet, compression и самого morgan.

Альтернативы morgan

morgan — простой логгер, форматирует строку вывода. Основные альтернативы:

  • pino-http — базируется на быстром pino. Выдаёт JSON, легко парсится. Минимальное влияние на производительность. Пример подключения:
const pinoHttp = require('pino-http')();
app.use(pinoHttp);
// В ответе появится req.log, можно логировать вручную
  • winston — популярный, гибкий, с транспортами (файл, консоль, Elasticsearch). express-winston — обёртка, которая автоматически логирует запросы. Позволяет кастомизировать формат и сохранять метаданные.
  • log4js — более громоздкий, но привычен для выходцев из Java. Есть connect-логгер.
  • Собственная middleware — если нужен минимальный функционал, пишут (req, res, next) => { console.log(req.method, req.originalUrl); next(); }. Для прода не хватает структуры, но для быстрого прототипа сойдёт.

Выбор зависит от требований: если нужно быстрое логирование в консоль с минимальным кодом — morgan ок. Если высокая нагрузка или структурированные логи — pino-http или winston. Если нужно централизованное хранение и ротация файлов — winston или log4js.

Ключевые тезисы

  • Middleware делятся по уровню подключения: app-level, router-level, error-handling, built-in, third-party.
  • Error-handling middleware обязана иметь 4 параметра и вызывать next(err).
  • Morgan — простой строковый логгер, альтернативы: pino-http (JSON, быстрый), winston (гибкий, транспорты), log4js, кастомная прослойка.
  • Для high-load лучше pino-http (меньше оверхед), для продакшн с ротацией файлов — winston.

Что спросят дальше

  • — Как бы вы организовали логирование ошибок в middleware, чтобы передавать их внешней системе (например, Sentry)?
  • — В чём разница между app.use() и app.METHOD() при подключении middleware? Как порядок middleware влияет на обработку?
  • — Как написать собственную middleware, которая добавляет в req идентификатор запроса (requestId)?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение