Первый сервер на Express: пошаговая инструкция
За 20 минут вы поднимете HTTP-сервер на Express 4.x: настроите маршруты, вернёте JSON, отдадите статику и научитесь ловить типичные ошибки старта.

К концу этой инструкции у вас будет работающий HTTP-сервер на Node.js и Express: он ответит текстом на главной странице, вернёт JSON на отдельном маршруте и отдаст HTML-файл из папки. На всё уйдёт около 20 минут, если Node.js уже установлен. Разбираться в устройстве event loop и middleware-конвейера здесь не нужно — цель в том, чтобы получить живой сервер, который отвечает в браузере.
Что нужно иметь до начала
Проверьте три вещи, чтобы не застрять на середине.
- Node.js 18 или новее. Express 4.x работает и на более старых версиях, но LTS-линии 18 и 20 — то, что стоит ставить сейчас. Проверьте командой
node -v: должна вывестись строка вродеv20.11.0. - npm. Ставится вместе с Node.js. Проверка —
npm -v, выведется номер версии. - Терминал и редактор кода. Подойдёт любой: VS Code, Sublime, встроенный терминал в системе.
Если node -v выдаёт ошибку «команда не найдена» — Node.js не установлен. Скачайте LTS-версию с nodejs.org и установите, затем откройте терминал заново.
Пошагово: от пустой папки до ответа в браузере
-
Создайте папку проекта и перейдите в неё.
mkdir my-express-app cd my-express-appПроверка: команда
pwd(илиcdв Windows без аргументов) покажет путь, оканчивающийся наmy-express-app. -
Инициализируйте npm-проект. Флаг
-yсогласится со всеми вопросами по умолчанию.npm init -yПроверка: в папке появился файл
package.json. Откройте его — там будет объект с полямиname,version,main. -
Установите Express.
npm install expressПроверка: появилась папка
node_modulesи файлpackage-lock.json, а вpackage.json— раздел"dependencies"со строкой вида"express": "^4.19.2". Точный номер версии зависит от даты установки. -
Создайте файл
server.js. Впишите в него минимальный сервер:// server.js — минимальный сервер на Express 4.x const express = require('express'); const app = express(); const PORT = 3000; // Маршрут главной страницы: отвечает обычным текстом app.get('/', (req, res) => { res.send('Сервер работает'); }); // Запуск: сервер начинает слушать порт app.listen(PORT, () => { console.log(`Сервер запущен: http://localhost:${PORT}`); });Проверка: файл сохранён в корне папки проекта, рядом с
package.json. -
Запустите сервер.
node server.jsПроверка: в терминале появилась строка
Сервер запущен: http://localhost:3000, и терминал «завис» — это нормально, процесс держит соединение. Откройте в браузереhttp://localhost:3000— увидите текст «Сервер работает». Остановить сервер —Ctrl+C.
Сервер не «запускается и завершается» — он остаётся живым процессом и слушает порт, пока вы не остановите его вручную. Если терминал вернул приглашение ко вводу сразу — значит, сервер упал, ищите ошибку выше.
Добавляем JSON-ответ
Отдавать текст мало — обычно от API ждут JSON. Express умеет это одним методом. Добавьте новый маршрут в server.js перед вызовом app.listen:
// Маршрут возвращает JSON
app.get('/api/status', (req, res) => {
res.json({
status: 'ok',
time: new Date().toISOString()
});
});
Метод res.json() сам выставляет заголовок Content-Type: application/json и сериализует объект — вручную вызывать JSON.stringify не нужно.
Перезапустите сервер (Ctrl+C, затем снова node server.js) и откройте http://localhost:3000/api/status. Проверка: в браузере появится объект вида {"status":"ok","time":"2024-..."}.
Важная деталь: Node.js не подхватывает изменения в коде на лету. После каждой правки сервер нужно перезапускать вручную. Как убрать эту рутину — в последнем разделе.
Отдаём статические файлы
Чтобы сервер возвращал HTML, CSS и картинки из папки, используется встроенный middleware express.static. Создайте папку public и в ней файл index.html:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Моя страница</title>
</head>
<body>
<h1>Статика отдаётся</h1>
</body>
</html>
Подключите папку в server.js. Строку добавьте до маршрута /, иначе он перехватит запрос к корню раньше:
// Раздаёт файлы из папки public
app.use(express.static('public'));
Перезапустите сервер и откройте http://localhost:3000/index.html. Проверка: увидите заголовок «Статика отдаётся». Файл index.html из папки public откроется и по корню /, если его не перекрывает ваш собственный маршрут — порядок объявления решает, кто ответит первым.
Если не получилось
Пять ошибок, на которые чаще всего натыкаются на старте.
| Что видите | Причина | Что делать |
|---|---|---|
Error: Cannot find module 'express' |
Пакет не установлен или запуск не из папки проекта | Выполните npm install express в корне папки, где лежит package.json |
EADDRINUSE: address already in use :::3000 |
Порт 3000 занят другим процессом или прошлым запуском | Остановите старый процесс (Ctrl+C в его терминале) или смените PORT на 3001 |
| Браузер: «Не удаётся установить соединение» | Сервер не запущен или упал с ошибкой | Вернитесь в терминал, найдите строку ошибки, исправьте и запустите заново |
SyntaxError: Unexpected token |
Опечатка в коде: лишняя скобка, пропущенная кавычка | В тексте ошибки указан файл и номер строки — проверьте её |
| Страница отдаёт «Cannot GET /путь» | Маршрута с таким путём нет | Проверьте, что путь в app.get() точно совпадает с адресом в браузере |
Что делать дальше
Сервер живёт и отвечает — теперь уберите главную боль разработки: ручной перезапуск после каждой правки. Установите nodemon как dev-зависимость и запускайте сервер через него:
npm install --save-dev nodemon
npx nodemon server.js
Теперь при сохранении файла сервер перезапустится сам. Следующие шаги, когда освоитесь с маршрутами:
- научитесь читать тело POST-запроса через встроенный
express.json()— понадобится для форм и API; - разнесите маршруты по отдельным файлам через
express.Router, когда их станет больше десятка; - вынесите порт в переменную окружения
process.env.PORT— это понадобится при деплое.
Обработка ошибок, авторизация и подключение базы данных — отдельные темы, здесь мы только подняли рабочий сервер. Актуальный набор middleware и методов сверяйте с официальной документацией Express: часть приёмов из старых руководств (например, отдельные пакеты body-parser) в Express 4.16+ встроены в сам фреймворк.
Антиблок-аналитик 115-ФЗ: Анализ выписок, поиск рисков блокировки счёта, инструкции по безопасным транзакциям.
Спросить за 41 ₽Источники: Express — официальная документация, Node.js — загрузки и версии LTS
Частые вопросы
У меня Express 5, а не 4 — инструкция сработает?
Почему после Ctrl+C сервер иногда всё равно занимает порт?
Нужно ли коммитить папку node_modules в git?
Что открыть, если браузер пишет «Cannot GET /»?
Можно ли выкладывать этот сервер в интернет как есть?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.