Express.js с нуля: Пошаговое руководство по созданию REST API

Подробное пошаговое руководство по созданию RESTful API с использованием фреймворка Express.js для Node.js, от настройки проекта и создания сервера до реализации маршрутов, middleware, подключения БД, обеспечения безопасности и тестирования.
Express.js остается одним из самых популярных и минималистичных фреймворков для создания веб-приложений и API на Node.js. Его гибкость и простота делают его идеальным выбором как для новичков, так и для опытных разработчиков. Это руководство шаг за шагом проведет вас через процесс создания надежного RESTful API с использованием современных практик.

Шаг 1: Настройка проекта. Убедитесь, что на вашей системе установлен Node.js (версии 18 или выше рекомендуется). Создайте новую директорию для проекта и инициализируйте его: откройте терминал и выполните `npm init -y`. Это создаст файл `package.json`. Теперь установите Express: `npm install express`. Для разработки также рекомендуется сразу установить `nodemon` как dev-зависимость для автоматической перезагрузки сервера при изменениях: `npm install --save-dev nodemon`. В `package.json` добавьте в раздел `"scripts"` строку: `"dev": "nodemon server.js"`.

Шаг 2: Создание базового сервера. Создайте файл `server.js` в корне проекта. Импортируйте Express и создайте экземпляр приложения:
`const express = require('express');`
`const app = express();`
`const PORT = process.env.PORT || 3000;`
Затем определите базовый маршрут для проверки:
`app.get('/', (req, res) => {`
`  res.send('Hello from Express API!');`
`});`
И наконец, запустите сервер:
`app.listen(PORT, () => {`
`  console.log(`Server is running on port ${PORT}`);`
`});`
Запустите сервер командой `npm run dev` и откройте в браузере `http://localhost:3000`. Вы должны увидеть приветственное сообщение.

Шаг 3: Работа с middleware. Middleware — это функции, которые имеют доступ к объектам запроса (req), ответа (res) и следующей функции middleware в цикле запрос-ответ. Express поставляется с некоторыми встроенными middleware, но самые важные для API нужно подключать отдельно. Для парсинга JSON в теле запроса используйте `express.json()`: `app.use(express.json());`. Для парсинга данных из форм (url-encoded) используйте `express.urlencoded({ extended: true })`. Эти middleware должны быть подключены до определения ваших маршрутов. Также рассмотрите подключение middleware для логирования, например, `morgan`: `npm install morgan`, а затем `const morgan = require('morgan'); app.use(morgan('dev'));`.

Шаг 4: Проектирование и реализация маршрутов REST API. Давайте создадим простое API для управления списком задач (To-Do). Создадим структуру маршрутов:
  • GET `/api/tasks` — получить все задачи.
  • GET `/api/tasks/:id` — получить задачу по ID.
  • POST `/api/tasks` — создать новую задачу.
  • PUT `/api/tasks/:id` — обновить задачу.
  • DELETE `/api/tasks/:id` — удалить задачу.
Для начала используем массив в памяти как "базу данных". Определите переменную `let tasks = [];`. Затем реализуйте обработчики. Например, для получения всех задач: `app.get('/api/tasks', (req, res) => {`
`  res.json(tasks);`
`});`
Для создания задачи (POST):
`app.post('/api/tasks', (req, res) => {`
`  const newTask = { id: Date.now().toString(), ...req.body };`
`  tasks.push(newTask);`
`  res.status(201).json(newTask); // Код 201 - Created`
`});`
Обратите внимание на использование `req.body`, который становится доступен благодаря middleware `express.json()`.

Шаг 5: Обработка ошибок и валидация. Простой API должен корректно обрабатывать ошибки. Например, при запросе несуществующей задачи нужно вернуть статус 404. Добавьте проверку в обработчик GET по ID:
`app.get('/api/tasks/:id', (req, res) => {`
`  const task = tasks.find(t => t.id === req.params.id);`
`  if (!task) {`
`  return res.status(404).json({ message: 'Task not found' });`
`  }`
`  res.json(task);`
`});`
Для централизованной обработки ошибок создайте middleware в конце файла, после всех маршрутов:
`app.use((err, req, res, next) => {`
`  console.error(err.stack);`
`  res.status(500).json({ message: 'Something went wrong!' });`
`});`
Для валидации входящих данных рассмотрите использование библиотек типа `joi` или `express-validator`.

Шаг 6: Структурирование проекта. По мере роста приложения, код в одном файле становится неуправляемым. Рекомендуется разделить логику по папкам: `routes/` (для маршрутов), `controllers/` (для обработчиков бизнес-логики), `models/` (для описания данных), `middlewares/` (для кастомных middleware). Например, создайте файл `routes/taskRoutes.js`, переместите туда все маршруты, связанные с задачами, и подключите их в `server.js` с помощью `app.use('/api/tasks', require('./routes/taskRoutes'));`.

Шаг 7: Подключение к реальной базе данных. Замените массив в памяти на постоянное хранилище. Для начала можно использовать SQLite с помощью `npm install sqlite3` или MongoDB с `mongoose`. Создайте подключение к БД в отдельном файле (например, `config/db.js`) и используйте его в контроллерах. Это добавит асинхронности, поэтому не забудьте использовать `async/await` в обработчиках маршрутов.

Шаг 8: Защита API (Безопасность). Добавьте ключевые элементы безопасности: 1) Используйте `helmet` для установки security-заголовков: `npm install helmet`, затем `app.use(helmet());`. 2) Реализуйте ограничение запросов (rate limiting) с помощью `express-rate-limit` для защиты от brute-force атак. 3) Для аутентификации и авторизации рассмотрите использование JWT (JSON Web Tokens) с библиотекой `jsonwebtoken` и `bcryptjs` для хеширования паролей. Создайте middleware для проверки токена, который будет защищать приватные маршруты.

Шаг 9: Документирование и тестирование API. Документируйте ваши эндпоинты с помощью Swagger/OpenAPI. Установите `swagger-jsdoc` и `swagger-ui-express` и настройте спецификацию. Для тестирования API используйте Supertest вместе с Jest. Напишите unit-тесты для контроллеров и интеграционные тесты для маршрутов, чтобы обеспечить надежность кода.

Следуя этим шагам, вы создадите чистое, структурированное и безопасное REST API на Express.js, готовое к дальнейшему масштабированию и интеграции с фронтенд-приложениями или мобильными клиентами.
160 4

Комментарии (9)

avatar
qezs3gy9ob8 31.03.2026
Отличное пошаговое руководство для новичков! Как раз искал структурированный материал по Express для своего первого API.
avatar
6xywymzrz 31.03.2026
Хотелось бы увидеть больше про обработку ошибок и валидацию входящих данных — это ключевые моменты для production.
avatar
rktb61x 01.04.2026
Идеальный старт! После такого гайда можно смело браться за свой pet-проект и углублять знания.
avatar
42szhi7r 01.04.2026
Для шага 1 хорошо бы дать ссылку на официальную документацию Node.js для установки, особенно под Windows.
avatar
7yhdswc 01.04.2026
А есть ли смысл сегодня начинать с чистого Express, а не сразу с TypeScript и какого-либо ORM?
avatar
kivju7ub2j0t 03.04.2026
Автор, добавьте, пожалуйста, сравнение с FastAPI или NestJS для тех, кто выбирает фреймворк.
avatar
xxq21rhvx 03.04.2026
Пункт про middleware стоило бы раскрыть подробнее. Это одна из самых мощных возможностей Express.
avatar
47u78tk4sagp 03.04.2026
Спасибо за акцент на современных практиках! Уже много устаревших туториалов, которые только сбивают с толку.
avatar
pvbcls9m 03.04.2026
Статья хорошая, но REST — это не только CRUD. Не хватает раздела про HATEOAS и версионирование API.
Вы просмотрели все комментарии