중첩 라우트
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) 도우미가 있습니다.
챌린지
쉬움방문자는 레시피에 리뷰를 남길 수 있습니다. 리뷰는 하나의 레시피에 속하므로 URL은 해당 레시피 아래에 있습니다: /api/recipes/1/reviews.
routes/reviews.js에서 라우터가 마운트된 경로에서 레시피 ID를 읽을 수 있도록 하세요. 그렇지 않으면 라우터 안에서req.params.id는undefined입니다(강의 내용을 참고하세요)./에 대한 GET 경로를 추가하세요. 해당 레시피의 리뷰를 JSON 목록으로 반환하고, 아직 리뷰가 없으면 빈 목록인[]를 반환합니다. 리뷰는reviews객체에 보관하고, 레시피 ID마다 목록 하나씩 둡니다. 예:{ "1": [{ "stars": 5, "text": "Lovely" }] }./에 대한 POST 경로를 추가하세요. 본문에서stars와text를 읽고 해당 레시피의 목록에 리뷰를 추가한 뒤, 상태 코드 201과 리뷰를 응답합니다:{"stars": 5, "text": "Lovely"}. 이 두 필드만 저장하고 전송하세요.- 두 경로 모두에서
hasRecipe(id)가 false이면 상태 코드 404와{"error": "No such recipe"}로 응답하세요. 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 플레이그라운드