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).
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.
- 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.idsẽ làundefinedbên trong bộ định tuyến (xem nội dung bài học). - 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ượngreviews, mỗi mã id công thức có một danh sách riêng, như{ "1": [{ "stars": 5, "text": "Lovely" }] }. - Thêm một tuyến POST cho
/. Tuyến này đọcstarsvàtexttừ 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 đó. - 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"}. - 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