Что такое 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 вроде слоёв и обработки ошибок ты собираешь сам — ровно этому и посвящён остаток курса.

Проверьте себя
1. Чем Express является по отношению к Node.js?
AОтдельной средой выполнения JavaScript
BБиблиотекой-надстройкой над встроенным http-модулем Node
CЗаменой Node для серверного кода
DБраузерным движком
2. Что произойдёт, если ни один обработчик не отправит ответ?
AExpress вернёт пустую страницу 200
BЗапрос зависнет до таймаута браузера
CNode сам отправит 404
DСервер аварийно остановится