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 | Примеры путей |
|---|---|---|---|
|
Получить данные | |
, |
|
Создать новый ресурс | |
, |
|
Обновить существующий ресурс | |
, |
|
Удалить ресурс | |
, |
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 и т.д.).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ