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。
挑战
简单server.js 越来越长了。把 recipe API 移到单独的文件 routes/recipes.js 中,这个文件已经有一个列出所有标签的路由。
- 在
routes/recipes.js的/tags路由下面,添加server.js中的四个 API 路由:列表路由、按 id 获取单个 recipe 的路由、添加 recipe 的 POST 路由,以及缩放路由。在路由器中,省略每个路径里的/api/recipes部分:/api/recipes/:id要改为/:id,列表路由要改为/。 - 把它们放在
/tags下面。Express 会按顺序尝试路由,如果把/:id放在前面,它就会匹配/tags,并查找 id 为tags的 recipe。 - 从
server.js中删除这四个路由。 - 在
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;
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Express 基础中的所有课
自己练习: Express 在线编辑器