Menu
CoddyTech

Express 路由器

本课属于 Coddy Node.js 学习旅程的“Express 基础”单元。第 19 课,共 23 课。

现在,server.js 包含页面、API 路由和中间件,而且还在不断增长。

// 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() 会创建一个拥有自己路由的小型应用,并将它们放在单独的文件中。app.use('/api/books', booksRouter) 会将它挂载起来:路由器中的 / 响应 GET /api/books,而 /:isbn 响应 GET /api/books/9780141439518。前缀只在 app.use 中写一次。路由器内部抛出的错误仍会传递给应用的错误处理器。

新文件 routes/recipes.js 中已经有一个路由:/tags。

challenge icon

挑战

简单

server.js 越来越长了。把 recipe API 移到单独的文件 routes/recipes.js 中,这个文件已经有一个列出所有标签的路由。

  1. 在 routes/recipes.js 的 /tags 路由下面,添加 server.js 中的四个 API 路由:列表路由、按 id 获取单个 recipe 的路由、添加 recipe 的 POST 路由,以及缩放路由。在路由器中,省略每个路径里的 /api/recipes 部分:/api/recipes/:id 要改为 /:id,列表路由要改为 /。
  2. 把它们放在 /tags 下面。Express 会按顺序尝试路由,如果把 /:id 放在前面,它就会匹配 /tags,并查找 id 为 tags 的 recipe。
  3. 从 server.js 中删除这四个路由。
  4. 在 server.js 中,从 ./routes/recipes.js 导入路由器,并使用 app.use 将它挂载到 /api/recipes。把它放在原来四个路由所在的位置:express.json() 之后、404 处理程序之前。

试试看:按“运行”,然后发送 /api/recipes/tags。你应该会看到 ["breakfast","dinner","soup","sweet","vegan"]。发送 /api/recipes/2:会得到 Pancakes recipe,和之前一样。向 /api/recipes 发送 POST {"title": "Toast"}:状态码为 201。然后发送 /api/recipes/5/scale?by=2:状态码为 500,并返回 {"error":"Something went wrong"},这说明在路由器内部抛出的错误仍会传递到你的错误处理程序。URL 没有变化,变化的只有代码所在的位置。

亲手试试

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

const router = express.Router();

// 每个标签只出现一次,按字母顺序排列。
router.get('/tags', (req, res) => {
    const tags = new Set(recipes.flatMap((recipe) => recipe.tags));
    res.json([...tags].sort());
});

// 把 /api/recipes 路由从 server.js 移到这里,放在 /tags 下方。
// 在路由器中,路径相对于路由器的挂载位置。

export default router;
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

Express 基础中的所有课

自己练习: Express 在线编辑器