路由参数
本课属于 Coddy Node.js 学习旅程的“Express 基础”单元。第 4 课,共 23 课。
Recipe Box 会存放很多食谱,如果每个食谱都设置一条路由,就永远设置不完。
app.get('/weather/:city', (req, res) => {
res.send('Forecast for ' + req.params.city);
});以冒号开头的路径部分是路由参数:它可以匹配任意值,而 Express 会把这个值放进 req.params。GET /weather/oslo 会发送 Forecast for oslo。
参数始终是字符串。GET /rooms/12 得到的是 '12',而 '12' === 12 的结果是 false,所以在将它与数字比较之前,要用 Number(...) 转换它。
如果请求的内容不存在,就返回 404 状态码:res.status(404).send('No such city') 会设置状态码,然后发送响应。
挑战
简单每个食谱都有自己的页面,路径中包含它的 id:/recipes/1、/recipes/2,依此类推。
- 在
server.js中,为/recipes/:id添加一条路由。它会在recipes(来自data.js)中查找id与路径中的 id 匹配的食谱。它只会以文本形式发送该食谱的标题:/recipes/2会发送Pancakes。 - 路径中的 id 是字符串,而
data.js中的 id 是数字,所以比较前要先转换它。 - 如果没有食谱的 id 与之匹配,就将状态码设为 404,并发送文本
No such recipe。
试试看:按“运行”,然后发送 /recipes/2。你应该会看到 Pancakes,状态码为 200。发送 /recipes/4:Fish & Chips。发送 /recipes/99:No such recipe,状态码为 404。
亲手试试
import express from 'express';
import { recipes } from './data.js';
const app = express();
app.get('/', (req, res) => {
res.send('Welcome to Recipe Box');
});
// type('text') 会发送纯文本,因此每个标题都会单独显示在一行。
app.get('/recipes', (req, res) => {
res.type('text').send(recipes.map((recipe) => recipe.title).join('\n'));
});
app.get('/about', (req, res) => {
res.send('Recipe Box collects family recipes.');
});
app.listen(3000, () => {
console.log('Recipe Box is running on port 3000');
});
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Express 基础中的所有课
自己练习: Express 在线编辑器