Menu
CoddyTech

중첩 라우트

Coddy Node.js 여정의 Express 기초 섹션에 포함된 레슨. 23개 중 20번째.

리뷰는 하나의 레시피에 속하므로 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

챌린지

쉬움

방문자는 레시피에 리뷰를 남길 수 있습니다. 리뷰는 하나의 레시피에 속하므로 URL은 해당 레시피 아래에 있습니다: /api/recipes/1/reviews.

  1. routes/reviews.js에서 라우터가 마운트된 경로에서 레시피 ID를 읽을 수 있도록 하세요. 그렇지 않으면 라우터 안에서 req.params.id는 undefined입니다(강의 내용을 참고하세요).
  2. /에 대한 GET 경로를 추가하세요. 해당 레시피의 리뷰를 JSON 목록으로 반환하고, 아직 리뷰가 없으면 빈 목록인 []를 반환합니다. 리뷰는 reviews 객체에 보관하고, 레시피 ID마다 목록 하나씩 둡니다. 예: { "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에서 라우터를 가져와 레시피 라우터 옆에, 404 처리기보다 앞서 /api/recipes/:id/reviews에 마운트하세요.

실행해 보기: ‘플레이’를 누르고 /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';

// recipe 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 플레이그라운드