Ответ
Express.js использует middleware-based подход. Каждый HTTP-запрос проходит через цепочку функций промежуточной обработки (middleware), которые выполняются последовательно в порядке их регистрации.
Ключевые моменты:
- Middleware имеет доступ к объектам запроса (
req), ответа (res) и функцииnext()для передачи управления следующему обработчику. - Он может выполнять любую операцию: логирование, парсинг тела запроса, аутентификацию, отправку ответа.
- Порядок регистрации через
app.use()и методы маршрутизации (app.get(),app.post()) критически важен.
Пример базового сервера:
const express = require('express');
const app = express();
// Middleware для логирования (выполняется для всех запросов)
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // Передаем управление дальше
});
// Middleware для парсинга JSON-тел запросов
app.use(express.json());
// Конечный обработчик маршрута
app.get('/api/users', (req, res) => {
res.json([{ id: 1, name: 'John' }]);
});
// Middleware для обработки 404 ошибок (регистрируется последним)
app.use((req, res) => {
res.status(404).send('Not Found');
});
app.listen(3000);
Такой подход обеспечивает гибкость, модульность и возможность повторного использования кода.
Ответ 18+ 🔞
А, Express.js! Ну, это как если бы твой HTTP-запрос был мужиком, который зашёл в длинный-предлинный коридор казённого учреждения. И на каждом углу его тормозят разные дядьки в форме — один бумажки проверяет, второй штамп ставит, третий просто так, по приколу, время потянуть может. Это и есть middleware-based подход, ёпта.
Суть в чём:
- Каждый такой «дядька» (middleware) имеет доступ к самому мужику-запросу (
req), к пустой бумажке для ответа (res) и к волшебной кнопкеnext(), которую надо нажать, чтобы мужика пропустили дальше по коридору. Если не нажмёшь — он так и будет стоять, нихуя не произойдёт. - Делать они могут что угодно: записать в журнал, что зашёл («логирование»), обыскать карманы и вытащить оттуда данные («парсинг тела»), проверить пропуск («аутентификация»), или сразу выписать ему справку и вытолкать в шею (отправить ответ).
- И вот тут важнейший момент, блядь: порядок, в котором ты этих дядек расставишь (
app.use()), — это всё. Сначала охранник на входе, потом бюрократ у стойки, а уж потом начальник в кабинете. Если поставить начальника первым — он нихуя не поймёт, кто к нему пришёл и зачем, потому что охранник ещё паспорт не проверил. Порядок регистрации — это пиздец как важно.
Смотри, как это выглядит в коде, обычный сервак:
const express = require('express');
const app = express();
// Первый дядька — журналист. Пишет в консоль, кто и когда пришёл.
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // Жмёт кнопку "дальше". Без этого всё нахуй встанет.
});
// Второй дядька — переводчик. Если мужик принёс бумажку с JSON-каракулями, он её расшифрует и прилепит к делу (req.body).
app.use(express.json());
// А вот это уже кабинет, куда мужик шёл. Начальник (обработчик маршрута) выдаёт ему справку.
app.get('/api/users', (req, res) => {
res.json([{ id: 1, name: 'John' }]);
});
// Самый последний дядька в самом конце коридора — злой дед-вахтёр. Если мужик дошёл сюда, значит, нужный ему кабинет так и не нашёлся. 404, твою мать.
app.use((req, res) => {
res.status(404).send('Not Found');
});
app.listen(3000);
Вот и весь подход. Гибко, модульно, и если какой-то дядька-посредник надоел — его можно выкинуть нахуй или заменить на другого, не трогая весь остальной конвейер. Удобная штука, если разобраться.