Что такое Express и зачем он нужен
Express превращает голый Node.js в удобный веб-фреймворк: вместо ручного разбора HTTP вы пишете маршруты и middleware.
«Express — это тонкий слой над встроенным модулем http. Он ничего не прячет, но избавляет от рутины.»
Представь, что тебе нужно сделать сайт, который отвечает на запросы браузера: отдаёт страницы, принимает формы, возвращает JSON для мобильного приложения. На чистом Node.js это возможно, но придётся вручную разбирать URL, методы, заголовки и тело запроса. Express делает за тебя 90% этой рутины и оставляет тебе только бизнес-логику. Именно поэтому он остаётся самым популярным веб-фреймворком экосистемы Node даже спустя десять лет после рождения.
В этом уроке мы посмотрим, что такое Express, зачем он нужен поверх Node и чем он отличается от соседей вроде Fastify и NestJS. Ты поймёшь, где проходит граница между "платформой" (Node) и "фреймворком" (Express), и почему эта граница важна для понимания всего остального курса.
Зачем нужен Express
Node.js — это среда выполнения JavaScript вне браузера. Она умеет открывать TCP-сокеты, читать файлы, работать с сетью. Но Node намеренно минималистичен: его модуль http даёт лишь сырой сервер. Express — это библиотека, которая поверх этого сырого сервера строит понятную модель: маршруты (что делать при запросе на конкретный путь) и middleware (цепочку обработчиков, через которую проходит каждый запрос).
Сравни два подхода. На чистом Node ты получаешь объект запроса и должен сам решить, какой это метод и путь:
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/hello') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Привет!');
} else {
res.writeHead(404);
res.end('Not found');
}
});
server.listen(3000);А вот то же самое на Express — короче и читаемее:
const express = require('express');
const app = express();
app.get('/hello', (req, res) => {
res.send('Привет!');
});
app.listen(3000, () => console.log('Сервер на 3000'));Express сам разобрал метод и путь, сам проставил заголовки и статус. Чем сложнее приложение, тем заметнее выигрыш.
Как работает под капотом
Когда ты вызываешь express(), создаётся функция-приложение. Под капотом эта функция совместима с сигнатурой (req, res), которую ожидает http.createServer. Поэтому app.listen() — это просто обёртка, которая создаёт настоящий http-сервер и передаёт ему приложение как обработчик. Внутри Express держит список маршрутов и middleware; на каждый входящий запрос он по очереди прогоняет их, пока кто-то не отправит ответ.
Ниже — схема того, что происходит, когда браузер стучится в Express-приложение:
Браузер
| GET /hello
v
[ http-сервер Node ]
| (req, res)
v
[ Express app ]
| ищет подходящий маршрут
v
[ app.get('/hello') ] -> res.send('Привет!')
|
v
Ответ 200 уходит браузеруВидно, что Express не заменяет Node, а встраивается в его поток. Это ключевая мысль: всё, что мы будем изучать, — надстройка над обычным http-сервером.
Частые ошибки
- Путать Node и Express. Node — платформа, Express — библиотека внутри неё. Express ставится через npm, Node — отдельно.
- Ждать, что Express сам отдаст ответ. Если ни один обработчик не вызвал
res.send()илиres.end(), запрос зависнет, а браузер будет крутить загрузку до таймаута. - Думать, что Express тяжёлый. На деле это маленькая библиотека: вся её сила — в простой модели маршрутов и middleware, а не в обилии функций.
Best practices
- Начинай с минимума: один файл, пара маршрутов. Структуру усложняй по мере роста проекта.
- Используй актуальную версию Node (18+), так как Express 5 требует именно её.
- Воспринимай Express как клей между HTTP и твоим кодом, а не как место для бизнес-логики.
Итоги
Express — это тонкая, но мощная надстройка над http-модулем Node. Она даёт две главные абстракции: маршруты и middleware. Всё остальное в курсе — развитие этих двух идей. В следующих уроках мы установим Express, поднимем первый сервер и разберём, как именно запрос проходит сквозь приложение.
Где Express, а где нет
Полезно держать в голове, что Express закрывает именно слой приёма и маршрутизации HTTP-запросов. Он не навязывает структуру проекта, не тянет за собой базу данных, не диктует шаблонизатор и не содержит встроенной валидации. Это и сила, и зона ответственности: микро-ядро легко выучить и трудно "перерасти", но архитектурные решения придётся принимать самому. Соседи устроены иначе: Fastify делает похожее, но с упором на скорость и встроенную валидацию схем, а NestJS — это уже целый каркас с готовой структурой и внедрением зависимостей поверх того же Express или Fastify. Выбор Express означает максимум свободы и прозрачности ценой того, что best practices вроде слоёв и обработки ошибок ты собираешь сам — ровно этому и посвящён остаток курса.