Menu
CoddyTech

路由参数

本课属于 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') 会设置状态码,然后发送响应。

challenge icon

挑战

简单

每个食谱都有自己的页面,路径中包含它的 id:/recipes/1、/recipes/2,依此类推。

  1. 在 server.js 中,为 /recipes/:id 添加一条路由。它会在 recipes(来自 data.js)中查找 id 与路径中的 id 匹配的食谱。它只会以文本形式发送该食谱的标题:/recipes/2 会发送 Pancakes。
  2. 路径中的 id 是字符串,而 data.js 中的 id 是数字,所以比较前要先转换它。
  3. 如果没有食谱的 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');
});
quiz icon自我测试

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

Express 基础中的所有课

自己练习: Express 在线编辑器