Menu
CoddyTech

ネストされたルート

CoddyのNode.jsジャーニー「Expressの基礎」セクションの一部。レッスン 17/20。

レビューは1つのレシピに属するため、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はアプリに属するため、mergeParams: trueを指定してルーターを作成しない限り、ルーター内ではundefinedになります。

routes/reviews.jsの準備はできており、reviewsオブジェクトとhasRecipe(id)ヘルパーがあります。

challenge icon

チャレンジ

簡単
  • GET /api/recipes/:id/reviews はそのレシピのレビューを返します。最初は [] です。
  • { "stars", "text" } を指定して POST すると、レビューが1件追加され、それを 201 とともに返します。
  • 存在しないレシピの場合は、{ "error": "No such recipe" } とともに 404 を返します。

レシピ1のレビューを投稿してから、GET /api/recipes/1/reviews と GET /api/recipes/99/reviews を送信してください。

自分で試してみよう

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 / はレビューを1件追加します。

export default router;

Expressの基礎のすべてのレッスン