Menu
CoddyTech

Express Router

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 19 trên 23.

Giờ đây, server.js chứa các trang, các tuyến API và middleware, đồng thời tệp này ngày càng dài hơn.

// routes/books.js
const router = express.Router();
router.get('/', (req, res) => res.json(books));
router.get('/:isbn', (req, res) => res.json(findBook(req.params.isbn)));
export default router;

// server.js
app.use('/api/books', booksRouter);

express.Router() tạo một ứng dụng nhỏ có các tuyến riêng, được đặt trong tệp riêng. app.use('/api/books', booksRouter) gắn router này vào ứng dụng: tuyến / của router xử lý GET /api/books, còn tuyến /:isbn xử lý GET /api/books/9780141439518. Tiền tố chỉ cần viết một lần trong app.use. Lỗi phát sinh bên trong router vẫn được chuyển đến trình xử lý lỗi của ứng dụng.

Tệp mới routes/recipes.js đã có sẵn một tuyến, /tags.

challenge icon

Thử thách

Dễ

server.js ngày càng dài. Hãy chuyển API công thức sang tệp riêng routes/recipes.js, nơi đã có tuyến liệt kê mọi thẻ.

  1. Trong routes/recipes.js, bên dưới tuyến /tags, hãy thêm bốn tuyến API từ server.js: tuyến liệt kê, tuyến lấy một công thức theo id, tuyến POST thêm công thức và tuyến điều chỉnh khẩu phần. Bên trong bộ định tuyến, hãy bỏ phần /api/recipes khỏi mỗi đường dẫn: /api/recipes/:id trở thành /:id, còn tuyến liệt kê trở thành /.
  2. Giữ các tuyến này bên dưới /tags. Express xử lý các tuyến theo thứ tự, và nếu đặt /:id lên trước, tuyến đó sẽ khớp với /tags và tìm công thức có id là tags.
  3. Xóa bốn tuyến đó khỏi server.js.
  4. Trong server.js, hãy import bộ định tuyến từ ./routes/recipes.js và gắn nó tại /api/recipes bằng app.use, ở vị trí của bốn tuyến trước đây: sau express.json() và trước trình xử lý lỗi 404.

Thử ngay: Nhấn Chạy và gửi /api/recipes/tags. Bạn sẽ thấy ["breakfast","dinner","soup","sweet","vegan"]. Gửi /api/recipes/2: công thức Pancakes như trước. Gửi POST {"title": "Toast"} đến /api/recipes: trạng thái 201. Sau đó gửi /api/recipes/5/scale?by=2: trạng thái 500 và {"error":"Something went wrong"}, nghĩa là lỗi phát sinh bên trong bộ định tuyến vẫn đến được trình xử lý lỗi của bạn. URL không thay đổi, chỉ vị trí của code thay đổi.

Tự làm thử

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

const router = express.Router();

// Mỗi thẻ xuất hiện một lần, theo thứ tự bảng chữ cái.
router.get('/tags', (req, res) => {
    const tags = new Set(recipes.flatMap((recipe) => recipe.tags));
    res.json([...tags].sort());
});

// Chuyển các tuyến /api/recipes từ server.js sang đây, bên dưới /tags.
// Trong router, các đường dẫn được tính tương đối so với vị trí gắn router.

export default router;
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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

Tự luyện tập: Playground Express