REST API на Express: CRUD

Собираем настоящий REST API: создаём, читаем, обновляем и удаляем ресурсы.

REST API — это подход, при котором операции над ресурсами (например, задачами) выражают через HTTP-методы: GET — читать, POST — создавать, PUT — обновлять, DELETE — удалять. Эту четвёрку называют CRUD.

Соответствие CRUD и HTTP

ОперацияHTTP-методМаршрут
Create (создать)POST/tasks
Read (прочитать)GET/tasks, /tasks/:id
Update (обновить)PUT/tasks/:id
Delete (удалить)DELETE/tasks/:id

Хранилище в памяти

Для учебного примера будем хранить задачи в обычном массиве (после перезапуска данные пропадут — для реального проекта нужна БД, о ней дальше):

const express = require("express");
const app = express();
app.use(express.json());

let tasks = [
  { id: 1, title: "Купить хлеб", done: false },
  { id: 2, title: "Позвонить врачу", done: true }
];
let nextId = 3;

Чтение: GET

Два маршрута на чтение — список всех задач и одна задача по id:

// все задачи
app.get("/tasks", (req, res) => {
  res.json(tasks);
});

// одна задача по id
app.get("/tasks/:id", (req, res) => {
  const task = tasks.find(t => t.id === Number(req.params.id));
  if (!task) return res.status(404).json({ error: "Не найдено" });
  res.json(task);
});

Создание: POST

Новая задача приходит в теле запроса. Создаём объект, добавляем в массив и возвращаем со статусом 201 Created:

app.post("/tasks", (req, res) => {
  const task = { id: nextId++, title: req.body.title, done: false };
  tasks.push(task);
  res.status(201).json(task);
});

Обновление и удаление

app.put("/tasks/:id", (req, res) => {
  const task = tasks.find(t => t.id === Number(req.params.id));
  if (!task) return res.status(404).json({ error: "Не найдено" });
  task.done = req.body.done;
  res.json(task);
});

app.delete("/tasks/:id", (req, res) => {
  tasks = tasks.filter(t => t.id !== Number(req.params.id));
  res.status(204).end(); // 204 — успех без тела
});

app.listen(3000);

Логика CRUD — это операции над массивом

Сердце API — обычные методы массива (find, push, filter). Они работают как чистый JS, и это можно проверить:

let tasks = [
  { id: 1, title: "Купить хлеб", done: false },
  { id: 2, title: "Позвонить врачу", done: true }
];
let nextId = 3;

// create
tasks.push({ id: nextId++, title: "Полить цветы", done: false });
// read one
const found = tasks.find(t => t.id === 2);
// update
found.done = false;
// delete
tasks = tasks.filter(t => t.id !== 1);

console.log("Осталось задач:", tasks.length);
console.log(tasks);

Вывод:

Осталось задач: 2
[
  { id: 2, title: 'Позвонить врачу', done: false },
  { id: 3, title: 'Полить цветы', done: false }
]

Итог

  • CRUD = Create/Read/Update/Delete, выраженные методами POST/GET/PUT/DELETE.
  • Маршруты: /tasks для списка, /tasks/:id для одного ресурса.
  • Статусы: 201 — создано, 204 — удалено без тела, 404 — не найдено.
  • Под капотом CRUD — это операции над массивом (find, push, filter).
Проверьте себя
1. Какой HTTP-метод используют для создания ресурса?
AGET
BPOST
CPUT
DDELETE
2. Какой статус принято возвращать после успешного создания ресурса?
A200
B201
C404
D500
3. Что вернуть, если задача с указанным id не найдена?
A200 с пустым телом
B404 с сообщением об ошибке
C201
D500
Поддержать проект