- Зачем вообще нужен Express
- Что получится в конце
- Подготовка проекта
- Самый короткий сервер
- Что здесь происходит
- Добавляем JSON endpoint
- Почему сервер нужно перезапускать
- Принимаем JSON из POST-запроса
- Как проверить POST-запрос
- Добавляем npm-скрипт
- Типичные ошибки
- Cannot find module 'express'
- EADDRINUSE
- POST-запрос приходит пустым
- Сервер не обновился после изменения кода
- Как понять, что урок усвоен
- Ответы на эти вопросы могут быть для вас полезными
- Express — это часть Node.js?
- Можно ли сделать сервер без Express?
- Нужно ли сразу учить Express Generator?
- Можно ли использовать Express для реального сайта?
- Что учить после первого сервера?
- Практическое задание
- Что почитать дальше по Node.js
Зачем вообще нужен Express
Node.js умеет создавать HTTP-сервер без библиотек, но для учебы и реальной разработки почти сразу хочется удобства: маршруты, JSON, middleware, обработка ошибок, статические файлы. Express закрывает этот слой и позволяет быстрее перейти от "я запускаю сервер" к "у меня есть понятный API"
В этом уроке сделаем маленький сервер для проекта соло-предпринимателя: главная страница, статус сервиса и endpoint для заявки. Никакой большой архитектуры пока не нужно. Нам важнее увидеть живую связку: URL — функция — ответ
Что получится в конце
У нас будет проект:
first-express-server/
package.json
server.js
Сервер будет отвечать на:
GET /— текстовая главная страница;GET /api/status— JSON со статусом;POST /api/leads— имитация приема заявки.
Подготовка проекта
Создайте папку и инициализируйте npm:
mkdir first-express-server
cd first-express-server
npm init -y
Установите Express:
npm install express
Создайте файл server.js
Самый короткий сервер
Начнем с минимальной версии:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Express сервер работает');
});
app.listen(port, () => {
console.log(`Сервер запущен: http://localhost:${port}`);
});
Запуск:
node server.js
Откройте:
http://localhost:3000
Если браузер показывает текст, Express уже работает
Что здесь происходит
const express = require('express');
Мы подключаем пакет Express
const app = express();
Создаем приложение. Это объект, на котором будем описывать маршруты
app.get('/', (req, res) => {
res.send('Express сервер работает');
});
Говорим: если пришел GET-запрос на /, отправь текстовый ответ
app.listen(port, () => {
console.log(`Сервер запущен: http://localhost:${port}`);
});
Запускаем прослушивание порта. Пока сервер запущен, терминал занят процессом Node.js. Остановить можно через Ctrl + C
Добавляем JSON endpoint
Backend часто нужен не для вывода текста, а для данных. Добавим маршрут:
app.get('/api/status', (req, res) => {
res.json({
ok: true,
service: 'first-express-server',
time: new Date().toISOString()
});
});
Полный файл теперь такой:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Express сервер работает');
});
app.get('/api/status', (req, res) => {
res.json({
ok: true,
service: 'first-express-server',
time: new Date().toISOString()
});
});
app.listen(port, () => {
console.log(`Сервер запущен: http://localhost:${port}`);
});
Перезапустите сервер и откройте:
http://localhost:3000/api/status
Теперь браузер покажет JSON. Это уже похоже на настоящий API
Почему сервер нужно перезапускать
Если вы меняете server.js, запущенный процесс не всегда сам подхватывает изменения. В базовом варианте нужно:
- Остановить сервер через
Ctrl + C. - Запустить снова:
node server.js
Позже можно поставить nodemon или использовать режим наблюдения, но для первого урока ручной перезапуск даже полезен: становится понятно, что сервер — это живой процесс
Принимаем JSON из POST-запроса
Добавим middleware:
app.use(express.json());
Теперь Express сможет читать JSON-тело запроса. Добавим маршрут:
app.post('/api/leads', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).json({
ok: false,
message: 'Нужны name и email'
});
}
res.status(201).json({
ok: true,
lead: {
id: Date.now(),
name,
email,
status: 'new'
}
});
});
Полный пример:
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
app.get('/', (req, res) => {
res.send('Express сервер работает');
});
app.get('/api/status', (req, res) => {
res.json({
ok: true,
service: 'first-express-server',
time: new Date().toISOString()
});
});
app.post('/api/leads', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).json({
ok: false,
message: 'Нужны name и email'
});
}
res.status(201).json({
ok: true,
lead: {
id: Date.now(),
name,
email,
status: 'new'
}
});
});
app.listen(port, () => {
console.log(`Сервер запущен: http://localhost:${port}`);
});
Как проверить POST-запрос
Через терминал:
curl -X POST http://localhost:3000/api/leads \
-H "Content-Type: application/json" \
-d '{"name":"Анна","email":"anna@example.com"}'
Ожидаемый ответ:
{
"ok": true,
"lead": {
"id": 1710000000000,
"name": "Анна",
"email": "anna@example.com",
"status": "new"
}
}
Если отправить пустой JSON, сервер должен вернуть ошибку 400. Это хорошо: API не молча принимает неполные данные
Добавляем npm-скрипт
{
"scripts": {
"start": "node server.js"
}
}
Теперь:
npm start
Для маленького проекта это не обязательно, но привычка полезная. Потом можно будет заменить команду запуска, не меняя инструкцию для себя и команды
Типичные ошибки
Cannot find module 'express'
Вы не установили Express в этой папке или запускаете файл из другой директории. Выполните:
npm install express
и проверьте pwd или текущую папку в терминале
EADDRINUSE
Порт занят. Поменяйте порт на 3001 или остановите другой процесс
POST-запрос приходит пустым
Проверьте две вещи:
- в коде есть
app.use(express.json()); - в запросе есть заголовок
Content-Type: application/json.
Сервер не обновился после изменения кода
Остановите процесс через Ctrl + C и запустите снова
Как понять, что урок усвоен
Вы не просто скопировали код, если можете ответить:
- что такое маршрут;
- чем
GETотличается отPOST; - зачем нужен
req; - зачем нужен
res; - почему JSON возвращают через
res.json; - где меняется порт;
- почему сервер нужно остановить перед новым запуском.
Ответы на эти вопросы могут быть для вас полезными
Express — это часть Node.js?
Нет. Node.js — среда выполнения, Express — отдельный npm-пакет для создания HTTP-серверов и API
Можно ли сделать сервер без Express?
Да, через встроенный модуль http. Но Express удобнее для учебных и практических веб-задач: маршруты, middleware и ответы пишутся короче
Нужно ли сразу учить Express Generator?
Не обязательно. Для первого понимания лучше один файл server.js. Генератор полезен позже, когда нужна структура проекта
Можно ли использовать Express для реального сайта?
Да. Но для продакшена нужно добавить валидацию, логирование, обработку ошибок, безопасность, переменные окружения и нормальный деплой
Что учить после первого сервера?
Следующий шаг — база данных. Можно пойти в MySQL, если хотите таблицы, или в MongoDB, если удобнее хранить документы
Практическое задание
Добавьте маршрут GET /api/about, который возвращает:
{
"project": "first-express-server",
"author": "solo founder",
"stack": ["Node.js", "Express"]
}
Если получилось, вы уже понимаете основной механизм Express: запрос пришел, маршрут сработал, ответ ушел
Что почитать дальше по Node.js
Если вы собираете тему по шагам, рядом лучше открыть:
- Как установить Node.js и npm — сверить установку Node.js и npm перед стартом.
- Node.js + MySQL: REST API для первых данных — добавить хранение данных через MySQL.
- Node.js + MongoDB: первая коллекция из приложения — попробовать документную базу MongoDB.
- Хостинг для Node.js сайта: что проверять перед выбором — понять, что понадобится для деплоя Express-приложения.



