← Назад к вопросам
Что такое 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 образует цепочку обработчиков, где каждая функция может:
- Выполнить код обработки
- Модифицировать объекты request и response
- Завершить цикл request-response
- Передать управление следующей 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 - преобразование данных запроса
Лучшие практики
- Порядок важен - регистрируй middleware в правильном порядке
- Всегда вызывай next() - если не завершаешь response
- Обработай ошибки - используй error handling middleware
- Избегай блокирующего кода - используй async/await
- Разделяй ответственность - одна middleware = одна функция
- Используй глобальные и локальные middleware - в зависимости от нужд
Middleware - это ключевой паттерн в Node.js, который позволяет организовать код чистым и модульным способом.