PurpleSchool — курсы программирования онлайн
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развития
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    REST API на Node.js и Express с нуля: пошаговое руководство

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

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

    Антон Ларичев

    Иконка календаря02 июня 2026
    Node.jsExpressREST APIBackendjuniorИконка уровня junior
    Картинка поста REST API на Node.js и Express с нуля: пошаговое руководство

    Введение

    REST API — это архитектурный стиль взаимодействия клиента и сервера через HTTP-протокол. Node.js в связке с Express позволяет быстро построить такой API: минимум кода, гибкая маршрутизация и богатая экосистема middleware. В этой статье разберём, как с нуля создать рабочий REST API для управления списком пользователей: настроим проект, реализуем CRUD-операции, подключим валидацию и научимся обрабатывать ошибки.

    Подготовка проекта

    Создадим директорию и инициализируем npm-проект:

    mkdir users-api && cd users-api
    npm init -y
    npm install express
    npm install -D nodemon
    

    В package.json добавим скрипт для запуска в режиме разработки:

    {
      "scripts": {
        "dev": "nodemon index.js",
        "start": "node index.js"
      }
    }
    

    nodemon автоматически перезапускает сервер при изменении файлов — это экономит время на разработку.

    Базовый сервер Express

    Создадим файл index.js с минимальным сервером:

    const express = require('express');
    const app = express();
    const PORT = 3000;
    
    // Подключаем парсер JSON для тела запросов
    app.use(express.json());
    
    app.get('/', (req, res) => {
      res.json({ message: 'API работает' });
    });
    
    app.listen(PORT, () => {
      console.log(`Сервер запущен на порту ${PORT}`);
    });
    

    Запускаем командой npm run dev и проверяем http://localhost:3000 — должны увидеть JSON-ответ. express.json() — встроенный middleware, который парсит тело запроса в формате JSON и кладёт результат в req.body.

    Реализация CRUD-операций

    REST подразумевает использование HTTP-методов для разных действий: GET — получение, POST — создание, PUT — обновление, DELETE — удаление. Реализуем ресурс users с временным хранилищем в памяти.

    // Временное хранилище данных
    let users = [
      { id: 1, name: 'Анна', email: 'anna@mail.ru' },
      { id: 2, name: 'Иван', email: 'ivan@mail.ru' }
    ];
    let nextId = 3;
    
    // Получение списка пользователей
    app.get('/users', (req, res) => {
      res.json(users);
    });
    
    // Получение одного пользователя
    app.get('/users/:id', (req, res) => {
      const id = Number(req.params.id);
      const user = users.find(u => u.id === id);
      if (!user) {
        return res.status(404).json({ error: 'Пользователь не найден' });
      }
      res.json(user);
    });
    
    // Создание нового пользователя
    app.post('/users', (req, res) => {
      const { name, email } = req.body;
      if (!name || !email) {
        return res.status(400).json({ error: 'name и email обязательны' });
      }
      const user = { id: nextId++, name, email };
      users.push(user);
      res.status(201).json(user);
    });
    
    // Обновление пользователя
    app.put('/users/:id', (req, res) => {
      const id = Number(req.params.id);
      const user = users.find(u => u.id === id);
      if (!user) {
        return res.status(404).json({ error: 'Пользователь не найден' });
      }
      Object.assign(user, req.body);
      res.json(user);
    });
    
    // Удаление пользователя
    app.delete('/users/:id', (req, res) => {
      const id = Number(req.params.id);
      users = users.filter(u => u.id !== id);
      res.status(204).send();
    });
    

    Обратите внимание на коды состояния: 200 — успех, 201 — создан ресурс, 204 — успех без тела ответа, 400 — ошибка клиента, 404 — не найдено. Корректное использование статусов — обязательная часть REST.

    Middleware и обработка ошибок

    Middleware — это функция, которая выполняется между запросом и ответом. С её помощью удобно реализовать логирование, авторизацию и централизованную обработку ошибок.

    // Логирование всех запросов
    app.use((req, res, next) => {
      console.log(`${req.method} ${req.url}`);
      next();
    });
    
    // Глобальный обработчик ошибок
    app.use((err, req, res, next) => {
      console.error(err.stack);
      res.status(500).json({ error: 'Внутренняя ошибка сервера' });
    });
    

    Обработчик ошибок должен иметь четыре аргумента — Express определяет его по сигнатуре. Размещать его нужно после всех маршрутов.

    Вынесение маршрутов в роутер

    Когда эндпоинтов становится много, полезно разделить код на модули с помощью express.Router:

    // routes/users.js
    const router = require('express').Router();
    
    router.get('/', (req, res) => res.json(users));
    router.post('/', (req, res) => { /* логика */ });
    
    module.exports = router;
    
    // index.js
    const usersRouter = require('./routes/users');
    app.use('/users', usersRouter);
    

    Такая структура упрощает поддержку и масштабирование проекта.

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

    Забытый express.json(). Без этого middleware req.body будет undefined, и POST-запросы перестанут работать. Подключайте его в самом начале до объявления маршрутов.

    Отсутствие валидации входных данных. Доверять данным клиента нельзя — используйте библиотеки joi, zod или express-validator для проверки типов и обязательных полей.

    Игнорирование асинхронных ошибок. Если внутри обработчика возникает ошибка в async-функции, Express её не поймает автоматически. Оборачивайте логику в try/catch или используйте express-async-errors.

    Неправильные HTTP-статусы. Возвращать 200 для ошибок — антипаттерн. Клиент должен по статусу понимать, что произошло.

    Хранение данных в памяти. Это допустимо только для прототипа. В реальном приложении нужна БД: PostgreSQL, MongoDB или хотя бы SQLite.

    Заключение

    Мы построили рабочий REST API на Node.js и Express: настроили проект, реализовали CRUD-операции, добавили middleware для логирования и обработки ошибок, вынесли маршруты в отдельный модуль. Следующие шаги — подключение базы данных через ORM (Prisma, TypeORM), добавление аутентификации через JWT, написание тестов с помощью Jest и Supertest, а также деплой на сервер. Express остаётся одним из самых популярных фреймворков для бэкенда на Node.js именно благодаря простоте и гибкости, которую вы только что увидели на практике.

    Иконка глаза8

    Комментарии

    0

    Постройте личный план изучения HTML и CSS - полный курс по вёрстке с нуля до уровня Middle — бесплатно!

    HTML и CSS - полный курс по вёрстке с нуля — часть карты развития Frontend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    TypeScript с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста JWT аутентификация в Node.js: access и refresh токены
    Иконка аватараАнтон
    Иконка календаря27 мая 2026
    Node.jsJWTАутентификация+ 2middleИконка уровня middle

    JWT аутентификация в Node.js: access и refresh токены

    JWT аутентификация в Node.js: разбираем работу access и refresh токенов, генерацию, валидацию и безопасное хранение на практике.

    Иконка чипа0
    Иконка глаза190
    Иконка комментариев0
    Картинка поста WebSocket на Node.js: строим real-time чат с нуля за час
    Иконка аватараАнтон
    Иконка календаря26 мая 2026
    Node.jsWebSocketJavaScript+ 2middleИконка уровня middle

    WebSocket на Node.js: строим real-time чат с нуля за час

    WebSocket на Node.js: пошаговое руководство по созданию real-time чата с библиотекой ws, обработкой подключений и broadcast-сообщений.

    Иконка чипа0
    Иконка глаза191
    Иконка комментариев0
    Картинка поста GraphQL vs REST: когда что выбирать и как перейти
    Иконка аватараАнтон
    Иконка календаря29 мая 2026
    GraphQLRESTAPI+ 1middleИконка уровня middle

    GraphQL vs REST: когда что выбирать и как перейти

    GraphQL vs REST: разбираем ключевые отличия двух подходов к проектированию API, сравниваем производительность и показываем стратегию плавной миграции.

    Иконка чипа0
    Иконка глаза78
    Иконка комментариев0
    Иконка чипа0