Express: установка и Hello World

Express — минималистичный и гибкий веб-фреймворк для Node.js, который предоставляет набор инструментов для построения HTTP-серверов и REST API.

Зачем нужно

Встроенный модуль http в Node.js требует ручной обработки URL, методов и заголовков. Express берёт это на себя: добавляет удобный routing API (app.get, app.post), middleware систему, удобные методы запроса и ответа (req.params, res.json). Это позволяет сосредоточиться на бизнес-логике, а не на инфраструктуре.

Где используется

  • REST API — основа большинства Node.js бэкендов
  • Прокси-серверы — переадресация запросов между сервисами
  • BFF (Backend For Frontend) — агрегация нескольких микросервисов
  • Сервер для SPA — раздача статики + API в одном процессе

Основной контент

Установка

mkdir my-app && cd my-app
npm init -y
npm install express

Hello World

// app.js
const express = require('express');
const app = express;

app.get('/', (req, res) => {
  res.send('Hello, Express!');
});

app.listen(3000, () => {
  console.log('Server running at http://localhost:3000');
});
node app.js
# Server running at http://localhost:3000

Типичная структура приложения

const express = require('express');
const path = require('path');

const app = express;

// --- Middleware ---
app.use(express.json());                          // парсить JSON body
app.use(express.urlencoded({ extended: true }));  // парсить form data
app.use(express.static(path.join(__dirname, 'public'))); // статика

// --- Маршруты ---
app.get('/', (req, res) => {
  res.json({ message: 'API работает' });
});

app.use('/api/users', require('./routes/users'));
app.use('/api/products', require('./routes/products'));

// --- 404 ---
app.use((req, res) => {
  res.status(404).json({ error: 'Not Found' });
});

// --- Error Handler ---
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(err.status || 500).json({ error: err.message });
});

// --- Запуск ---
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server on port ${PORT}`));

module.exports = app; // для тестов

Объект app

// app — экземпляр Express Application
app.get(path, handler)     // регистрация GET-маршрута
app.post(path, handler)    // POST
app.use(path?, middleware) // подключение middleware
app.listen(port, callback) // запуск HTTP-сервера
app.set('key', value)      // настройки приложения
app.get('key')             // получить настройку

req и res

app.get('/demo', (req, res) => {
  // req — объект запроса
  console.log(req.method);        // 'GET'
  console.log(req.path);          // '/demo'
  console.log(req.query);         // { page: '1' }
  console.log(req.params);        // { id: '42' }
  console.log(req.body);          // { name: 'Alice' }
  console.log(req.headers);       // все заголовки

  // res — объект ответа
  res.status(200)                 // установить статус
    .json({ ok: true });          // отправить JSON

  // другие методы
  res.send('plain text');
  res.sendFile('/path/to/file');
  res.redirect('/login');
  res.render('index', { title: 'Home' }); // шаблонизатор
});

Частые ошибки

  • Забыть express.jsonreq.body будет undefined при POST с JSON
  • Слушать порт внутри модуля — при импорте в тесты сервер запустится дважды; выносить app.listen в отдельный server.js
  • Не обрабатывать ошибки — unhandled rejection в async-обработчике крашит процесс
  • Использовать res.send после res.json — "Cannot set headers after they are sent"

Связанные темы

Ресурсы