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