Menu
CoddyTech

Các tuyến lồng nhau

Thuộc phần Kiến thức cơ bản về Express trong hành trình Node.js của Coddy. Bài học 20 trên 23.

Đánh giá thuộc về một công thức, nên URL của chúng nằm bên dưới công thức đó: /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 của một bộ định tuyến chỉ chứa các tham số trong các đường dẫn của chính nó. :isbn trong đường dẫn gắn bộ định tuyến thuộc về ứng dụng, nên bên trong bộ định tuyến, nó là undefined, trừ khi bạn tạo bộ định tuyến với mergeParams: true.

routes/reviews.js đã sẵn sàng, với một đối tượng reviews và hàm trợ giúp hasRecipe(id).

challenge icon

Thử thách

Dễ

Khách truy cập có thể để lại đánh giá cho một công thức. Mỗi đánh giá thuộc về một công thức, vì vậy URL của đánh giá nằm bên dưới công thức đó: /api/recipes/1/reviews.

  1. Trong routes/reviews.js, cấu hình bộ định tuyến để đọc mã id của công thức từ đường dẫn mà nó được gắn vào. Nếu không, req.params.id sẽ là undefined bên trong bộ định tuyến (xem nội dung bài học).
  2. Thêm một tuyến GET cho /. Tuyến này trả về các đánh giá của công thức đó dưới dạng danh sách JSON, hoặc danh sách rỗng, [], nếu chưa có đánh giá nào. Lưu các đánh giá trong đối tượng reviews, mỗi mã id công thức có một danh sách riêng, như { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Thêm một tuyến POST cho /. Tuyến này đọc stars và text từ phần thân yêu cầu, thêm đánh giá vào danh sách của công thức đó, rồi phản hồi với trạng thái 201 và đánh giá: {"stars": 5, "text": "Lovely"}. Chỉ lưu và gửi hai trường đó.
  4. Trong cả hai tuyến, khi hasRecipe(id) là false, hãy phản hồi với trạng thái 404 và {"error": "No such recipe"}.
  5. Trong server.js, nhập bộ định tuyến và gắn nó vào /api/recipes/:id/reviews, bên cạnh bộ định tuyến công thức và trước trình xử lý 404.

Thử: Nhấn Chạy và gửi /api/recipes/1/reviews: []. Chọn POST và gửi {"stars": 5, "text": "Lovely"} đến /api/recipes/1/reviews: trạng thái 201 và đánh giá. Gửi GET đến /api/recipes/1/reviews lần nữa: [{"stars":5,"text":"Lovely"}]. Gửi /api/recipes/2/reviews: vẫn là [], vì mỗi công thức lưu các đánh giá riêng. Gửi /api/recipes/99/reviews: trạng thái 404 và {"error":"No such recipe"}.

Tự làm thử

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

// Các đánh giá theo id công thức, ví dụ { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

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

const router = express.Router();

// GET / liệt kê các đánh giá của một công thức. POST / thêm một đánh giá.

export default router;

Tất cả bài học trong Kiến thức cơ bản về Express

Tự luyện tập: Playground Express