Middleware — это функции, которые выполняются между запросом клиента и обработчиком маршрута на сервере. Они обеспечивают промежуточную обработку данных, проверку условий, модификацию запроса или ответа. В экосистеме Node.js и Express.js middleware занимает ключевое место, позволяя создавать гибкие и расширяемые серверные приложения.
Middleware получает три аргумента: req (объект запроса),
res (объект ответа) и next (функция для
передачи управления следующему middleware).
function exampleMiddleware(req, res, next) {
console.log('Запрос обработан на уровне middleware');
next();
}
Вызов next() обязателен, если нужно продолжить обработку
запроса. Без него запрос зависнет.
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log('Application-level middleware');
next();
});
app.get('/home', (req, res) => {
res.send('Главная страница');
});
express.Router). Используется для групп
маршрутов с общими правилами.const router = express.Router();
router.use((req, res, next) => {
console.log('Router-level middleware');
next();
});
router.get('/profile', (req, res) => {
res.send('Профиль пользователя');
});
app.use('/user', router);
next(err). Должен иметь четыре
аргумента: err, req, res,
next.app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Произошла ошибка на сервере');
});
app.use(express.json()); // парсит JSON из тела запроса
app.use(express.urlencoded({ extended: true })); // парсит данные формы
app.use(express.static('public')); // отдаёт статические файлы
morgan),
сессии (express-session), CORS (cors) и
другие.const morgan = require('morgan');
app.use(morgan('dev'));
Middleware можно использовать на уровне отдельных маршрутов для проверки авторизации, валидации данных или логирования.
function authMiddleware(req, res, next) {
if (req.headers.authorization === 'Bearer token') {
next();
} else {
res.status(401).send('Неавторизован');
}
}
app.get('/dashboard', authMiddleware, (req, res) => {
res.send('Панель управления');
});
app.post('/submit', [validateData, authMiddleware], (req, res) => {
res.send('Данные отправлены');
});
Middleware может быть асинхронным с использованием
async/await. При ошибках важно передавать их через
next(err).
async function asyncMiddleware(req, res, next) {
try {
const data = await fetchDataFromDB();
req.data = data;
next();
} catch (err) {
next(err);
}
}
Middleware для маршрутов является фундаментальным инструментом для организации серверной логики. Оно обеспечивает повторное использование кода, безопасность и масштабируемость приложений, позволяя создавать сложные цепочки обработки запросов с минимальным дублированием кода.