Роутинг в Express.js

Модуль 4: Node.js, Next.js и Angular
5 уровень , 2 лекция
Открыта

1. Что такое роутинг в Express.js?

Роутинг — это способ определить, как ваше приложение будет реагировать на определённые HTTP-запросы по определённым путям (URL). Представьте, что сервер — это вахтёр в бизнес-центре: кто-то приходит с запросом "Показать список сотрудников" (GET /employees), кто-то — "Добавить нового сотрудника" (POST /employees), а кто-то — "Удалить сотрудника" (DELETE /employees/42). В зависимости от запроса и его типа сервер должен выполнять разные действия.

В Express.js роутинг реализуется с помощью методов объекта приложения (app), таких как app.get, app.post, app.put, app.delete и других.

Синтаксис основных методов роутинга

Вот базовый синтаксис для обработки запросов разных типов:

app.get(path, handler)
app.post(path, handler)
app.put(path, handler)
app.delete(path, handler)
  • path — строка, описывающая путь (например, /users или /tasks/:id)
  • handler — функция, которая будет вызвана при совпадении пути и метода

Пример самого простого маршрута

app.get('/', (req, res) => {
  res.send('Главная страница');
});

Вспоминаем различие между GET, POST, PUT, DELETE

Кратко о каждом методе:

  • GET — получить данные (например, список пользователей). "Покажи мне!"
  • POST — создать новый ресурс. "Добавь нового!"
  • PUT — полностью заменить существующий ресурс. "Обнови информацию!"
  • DELETE — удалить ресурс. "Удали этого!"

Это так называемые CRUD-операции: Create, Read, Update, Delete.

2. Пример: Мини-приложение "Список задач"

Давайте шаг за шагом создадим простое приложение для управления задачами (TODO-list). Для простоты, все задачи будем хранить в массиве в памяти.

Начальная заготовка

const express = require('express');
const app = express();
const PORT = 3000;

// Встроенный middleware для парсинга JSON
app.use(express.json());

// "База данных" — просто массив
let tasks = [
  { id: 1, text: 'Купить хлеб', done: false },
  { id: 2, text: 'Выучить Express', done: false }
];

Получить список задач — GET /tasks

app.get('/tasks', (req, res) => {
  res.json(tasks);
});

Что происходит?
Когда пользователь заходит на /tasks методом GET, сервер возвращает весь массив задач в формате JSON.

Получить одну задачу по id — GET /tasks/:id

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

Что происходит?
Если пользователь обращается к /tasks/2, Express достаёт id из req.params, ищет задачу и возвращает её или ошибку.

Добавить задачу — POST /tasks

app.post('/tasks', (req, res) => {
  const { text } = req.body;
  if (!text) {
    return res.status(400).json({ error: 'Нет текста задачи' });
  }
  const newTask = {
    id: tasks.length ? tasks[tasks.length - 1].id + 1 : 1,
    text,
    done: false
  };
  tasks.push(newTask);
  res.status(201).json(newTask);
});

Что происходит?
Клиент отправляет запрос с телом вида { "text": "Погладить кота" }. Сервер добавляет новую задачу в массив и возвращает её с кодом 201 (Created).

Обновить задачу — PUT /tasks/:id

app.put('/tasks/:id', (req, res) => {
  const id = Number(req.params.id);
  const { text, done } = req.body;
  const task = tasks.find(t => t.id === id);
  if (!task) {
    return res.status(404).json({ error: 'Задача не найдена' });
  }
  if (typeof text === 'string') task.text = text;
  if (typeof done === 'boolean') task.done = done;
  res.json(task);
});

Что происходит?
Клиент отправляет запрос с новыми данными для задачи. Сервер находит задачу по id, обновляет поля и возвращает обновлённую задачу.

Удалить задачу — DELETE /tasks/:id

app.delete('/tasks/:id', (req, res) => {
  const id = Number(req.params.id);
  const index = tasks.findIndex(t => t.id === id);
  if (index === -1) {
    return res.status(404).json({ error: 'Задача не найдена' });
  }
  const deleted = tasks.splice(index, 1)[0];
  res.json(deleted);
});

Что происходит?
Сервер удаляет задачу по id и возвращает её клиенту. Если задачи с таким id нет — отправляет ошибку.

3. Полезные нюансы

Пример работы через Postman или curl

Получить все задачи:
GET http://localhost:3000/tasks

Добавить новую задачу:
POST http://localhost:3000/tasks
Тело запроса:

{
  "text": "Сделать домашку по Express"
}

Обновить задачу:
PUT http://localhost:3000/tasks/1
Тело запроса:

{
  "done": true
}

Удалить задачу:
DELETE http://localhost:3000/tasks/2

Кратко о res и req

  • req — объект запроса, хранит всю информацию о пришедшем запросе (путь, параметры, тело, заголовки и т.д.)
  • res — объект ответа, позволяет отправить ответ клиенту (текст, JSON, статус-код и т.д.)

Сравнение методов роутинга

Метод Назначение Как вызвать в Express Примеры путей
GET
Получить данные
app.get('/url', ...)
/tasks
,
/users/:id
POST
Создать новый ресурс
app.post('/url', ...)
/tasks
,
/users
PUT
Обновить существующий ресурс
app.put('/url', ...)
/tasks/:id
,
/users/:id
DELETE
Удалить ресурс
app.delete('/url', ...)
/tasks/:id
,
/users/:id

4. Типичные ошибки при работе с роутингом Express

Ошибка №1: Не тот HTTP-метод.
Иногда в браузере пытаются "удалить" или "обновить" ресурс через GET-запрос. Но браузер по ссылке всегда делает GET! Поэтому для тестирования PUT и DELETE используйте специальные инструменты (Postman, curl, fetch в JS).

Ошибка №2: Не подключён парсер JSON.
Если забыть добавить app.use(express.json()), то req.body в POST/PUT-запросах будет undefined. Это как пытаться читать письмо без очков — буквы есть, а смысла нет.

Ошибка №3: Перепутаны параметры пути и запроса.
/tasks/:id — это параметр пути, а /tasks?id=5 — query-параметр. В первом случае используйте req.params.id, во втором — req.query.id.

Ошибка №4: Не возвращается ответ.
Если забыть вызвать res.send(), res.json() или аналогичный метод, клиент будет ждать ответа вечно — и, возможно, задумается о смысле жизни. Всегда завершайте обработчик отправкой ответа!

Ошибка №5: Необработанные ошибки.
Если не проверить, что задача найдена (например, при обновлении или удалении), сервер может отправить пустой ответ или вовсе упасть. Всегда проверяйте существование ресурса и отправляйте ошибку с нужным кодом (404, 400 и т.д.).

1
Задача
Модуль 4: Node.js, Next.js и Angular, 5 уровень, 2 лекция
Недоступна
Обработка GET-запроса
Обработка GET-запроса
1
Задача
Модуль 4: Node.js, Next.js и Angular, 5 уровень, 2 лекция
Недоступна
Добавление элемента через POST
Добавление элемента через POST
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ