Как ответить
В 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.