Menu
CoddyTech

Вложенные маршруты

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

Отзывы относятся к одному рецепту, поэтому их URL находятся внутри его пути: /api/recipes/2/reviews.

const chapters = express.Router({ mergeParams: true });

chapters.get('/', (req, res) => {
    res.json(chaptersOf(req.params.isbn));
});

app.use('/api/books/:isbn/chapters', chapters);

В req.params маршрутизатора содержатся только параметры его собственных путей. Параметр :isbn в пути монтирования принадлежит приложению, поэтому внутри маршрутизатора он равен undefined, если только маршрутизатор не создан с параметром mergeParams: true.

routes/reviews.js готов: в нём есть объект reviews и вспомогательная функция hasRecipe(id).

challenge icon

Задание

Легко

Посетители могут оставлять отзывы о рецепте. Отзыв относится к одному рецепту, поэтому его URL находится в маршруте этого рецепта: /api/recipes/1/reviews.

  1. В routes/reviews.js настрой роутер так, чтобы он мог читать идентификатор рецепта из пути, к которому он подключён. Без этого req.params.id внутри роутера будет иметь значение undefined (см. текст урока).
  2. Добавь GET-маршрут для /. Он возвращает отзывы этого рецепта в виде JSON-списка или пустой список [], если отзывов пока нет. Храни отзывы в объекте reviews, отдельным списком для каждого идентификатора рецепта, например { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Добавь POST-маршрут для /. Он считывает stars и text из тела запроса, добавляет отзыв в список этого рецепта и отвечает статусом 201 и отзывом: {"stars": 5, "text": "Lovely"}. Сохраняй и отправляй только эти два поля.
  4. В обоих маршрутах, если hasRecipe(id) возвращает false, ответь статусом 404 и {"error": "No such recipe"}.
  5. В server.js импортируй роутер и подключи его по пути /api/recipes/:id/reviews, рядом с роутером рецептов и перед обработчиком 404.

Попробуй: Нажми «Играть» и отправь /api/recipes/1/reviews: []. Выбери POST и отправь {"stars": 5, "text": "Lovely"} на /api/recipes/1/reviews: статус 201 и отзыв. Снова отправь GET-запрос на /api/recipes/1/reviews: [{"stars":5,"text":"Lovely"}]. Отправь /api/recipes/2/reviews: по-прежнему [], потому что у каждого рецепта свой список отзывов. Отправь /api/recipes/99/reviews: статус 404 и {"error":"No such recipe"}.

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

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

// Отзывы по id рецепта, например { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));

const router = express.Router();

// GET / выводит список отзывов о рецепте. POST / добавляет отзыв.

export default router;

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

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