Menu
CoddyTech

Маршрутизатор Express

Часть раздела Основы Express путешествия по Node.js на Coddy. Урок 19 из 23.

Теперь в server.js находятся страницы, маршруты API и промежуточное ПО, и он продолжает разрастаться.

// routes/books.js
const router = express.Router();
router.get('/', (req, res) => res.json(books));
router.get('/:isbn', (req, res) => res.json(findBook(req.params.isbn)));
export default router;

// server.js
app.use('/api/books', booksRouter);

express.Router() создаёт небольшое приложение со своими маршрутами, размещёнными в отдельном файле. app.use('/api/books', booksRouter) монтирует его: / маршрутизатора обрабатывает GET /api/books, а /:isbn — GET /api/books/9780141439518. Префикс указывается один раз, в app.use. Ошибки, возникшие внутри маршрутизатора, по-прежнему передаются обработчику ошибок приложения.

В новом файле routes/recipes.js уже есть один маршрут — /tags.

challenge icon

Задание

Легко

server.js продолжает разрастаться. Перенеси API рецептов в отдельный файл routes/recipes.js, где уже есть маршрут, перечисляющий все теги.

  1. В routes/recipes.js, ниже маршрута /tags, добавь четыре маршрута API из server.js: список, один рецепт по id, POST-запрос для добавления рецепта и маршрут масштабирования. Внутри маршрутизатора убери из каждого пути часть /api/recipes: /api/recipes/:id становится /:id, а список — /.
  2. Оставь их ниже /tags. Express проверяет маршруты по порядку, и если сначала разместить /:id, он перехватит /tags и будет искать рецепт с id tags.
  3. Удали эти четыре маршрута из server.js.
  4. В server.js импортируй маршрутизатор из ./routes/recipes.js и подключи его по пути /api/recipes с помощью app.use там, где находились четыре маршрута: после express.json() и до обработчика 404.

Проверь: Нажми «Играть» и отправь запрос к /api/recipes/tags. Ты должен увидеть ["breakfast","dinner","soup","sweet","vegan"]. Отправь запрос к /api/recipes/2: рецепт Pancakes, как и раньше. Отправь POST-запрос с телом {"title": "Toast"} к /api/recipes: статус 201. Затем отправь запрос к /api/recipes/5/scale?by=2: статус 500 и {"error":"Something went wrong"}, то есть ошибки, возникающие внутри маршрутизатора, по-прежнему доходят до обработчика ошибок. URL-адреса не изменились — изменилось только место, где находится код.

Попробуйте сами

import express from 'express';
import { recipes } from '../data.js';

const router = express.Router();

// Каждый тег — по одному разу, в алфавитном порядке.
router.get('/tags', (req, res) => {
    const tags = new Set(recipes.flatMap((recipe) => recipe.tags));
    res.json([...tags].sort());
});

// Перенесите маршруты /api/recipes из server.js сюда, ниже /tags.
// Внутри роутера пути задаются относительно места его подключения.

export default router;
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы Express

Потренируйтесь самостоятельно: Песочница Express