← Назад к вопросам

Что такое Middleware в Node.js?

2.0 Middle🔥 161 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI20 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Middleware в Node.js

Middleware (промежуточное программное обеспечение) - это функции, которые имеют доступ к объекту запроса (request), объекту ответа (response) и следующей функции middleware в цикле "request-response" приложения. Middleware выполняет логику обработки запроса и может передать управление следующей middleware функции через функцию `next()`.

Основная концепция

Middleware образует цепочку обработчиков, где каждая функция может:

  1. Выполнить код обработки
  2. Модифицировать объекты request и response
  3. Завершить цикл request-response
  4. Передать управление следующей middleware через next()

Структура Middleware

// Базовая структура middleware функции
const middleware = (req, res, next) => {
  // Код выполняется когда middleware вызывается
  console.log('Запрос получен:', req.method, req.path);
  
  // Модифицируем request объект
  req.customProperty = 'значение';
  
  // Передаем управление следующей middleware
  next();
};

// Или с async/await
const asyncMiddleware = async (req, res, next) => {
  try {
    // Асинхронная операция
    const user = await fetchUser(req.userId);
    req.user = user;
    next();
  } catch (error) {
    next(error); // Передаем ошибку в error handler
  }
};

Практические примеры в Express

1. Middleware для логирования

const express = require('express');
const app = express();

// Логирование всех запросов
const logger = (req, res, next) => {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
  next();
};

app.use(logger);

2. Middleware для аутентификации

const authenticate = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];
  
  if (!token) {
    return res.status(401).json({ error: 'Токен не найден' });
  }
  
  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.userId = decoded.id;
    next();
  } catch (error) {
    res.status(403).json({ error: 'Невалидный токен' });
  }
};

// Применяем только к защищенным маршрутам
app.get('/profile', authenticate, (req, res) => {
  res.json({ userId: req.userId });
});

3. Middleware для валидации данных

const validateUserInput = (req, res, next) => {
  const { email, name } = req.body;
  
  if (!email || !email.includes('@')) {
    return res.status(400).json({ error: 'Невалидный email' });
  }
  
  if (!name || name.length < 2) {
    return res.status(400).json({ error: 'Имя слишком короткое' });
  }
  
  next();
};

app.post('/users', validateUserInput, (req, res) => {
  // req.body уже валидирован
  res.json({ success: true });
});

4. Middleware для обработки ошибок

// Должна быть последней в цепи
const errorHandler = (err, req, res, next) => {
  console.error('Ошибка:', err.message);
  
  res.status(err.status || 500).json({
    error: err.message,
    timestamp: new Date().toISOString()
  });
};

app.use(errorHandler);

5. CORS Middleware

const cors = require('cors');

// Встроенная middleware для управления CORS
app.use(cors({
  origin: 'http://localhost:3000',
  credentials: true
}));

Порядок выполнения Middleware

Middleware выполняются в порядке их регистрации:

app.use((req, res, next) => {
  console.log('1');
  next();
});

app.use((req, res, next) => {
  console.log('2');
  next();
});

app.use((req, res, next) => {
  console.log('3');
  res.send('Ответ');
});

// Вывод: 1, 2, 3

Области применения Middleware

  • Authentication - проверка авторизации пользователя
  • Logging - логирование запросов и ошибок
  • CORS - настройка кроссдоменных запросов
  • Compression - сжатие ответов
  • Validation - валидация входных данных
  • Rate Limiting - ограничение количества запросов
  • Body Parsing - обработка тела запроса (JSON, формы)
  • Error Handling - централизованная обработка ошибок
  • Request Transformation - преобразование данных запроса

Лучшие практики

  1. Порядок важен - регистрируй middleware в правильном порядке
  2. Всегда вызывай next() - если не завершаешь response
  3. Обработай ошибки - используй error handling middleware
  4. Избегай блокирующего кода - используй async/await
  5. Разделяй ответственность - одна middleware = одна функция
  6. Используй глобальные и локальные middleware - в зависимости от нужд

Middleware - это ключевой паттерн в Node.js, который позволяет организовать код чистым и модульным способом.