# 动态路由与参数提取

URL: https://caijiao.org/express/chapter3/2-dynamic-routing
Source: docs/express/chapter3/2-dynamic-routing.md
Description: 本章节介绍 Express 中动态路由和参数提取的使用方法，讲解如何通过路由参数和查询字符串获取客户端传递的数据。

动态路由允许在路径中定义变量部分，以匹配不同的请求路径并提取参数，方便处理用户输入和资源标识。

## 路由参数（Route Parameters）

使用冒号 `:` 定义路由中的动态部分：

```js
app.get('/user/:id', (req, res) => {
  const userId = req.params.id;
  res.send(`用户ID是：${userId}`);
});
````

访问 `/user/123`，`req.params.id` 即为 `'123'`。

可以定义多个参数：

```js
app.get('/order/:orderId/item/:itemId', (req, res) => {
  res.send(`订单ID：${req.params.orderId}, 商品ID：${req.params.itemId}`);
});
```

## 参数匹配规则

* 路由参数只能匹配非斜杠的字符串。
* 可使用问号 `?` 表示参数可选：

```js
app.get('/user/:id?', (req, res) => {
  res.send(req.params.id ? `用户ID：${req.params.id}` : '无用户ID');
});
```

## 查询参数（Query Parameters）

查询参数位于 URL `?` 之后，通过 `req.query` 访问：

URL 示例：`/search?keyword=express&page=2`

```js
app.get('/search', (req, res) => {
  const { keyword, page } = req.query;
  res.send(`搜索关键词：${keyword}, 页码：${page}`);
});
```

## 结合使用示例

```js
app.get('/products/:category', (req, res) => {
  const category = req.params.category;
  const sort = req.query.sort || 'default';
  res.send(`类别：${category}，排序方式：${sort}`);
});
```

访问 `/products/electronics?sort=price`，得到类别为 electronics，排序为 price。

## 总结

动态路由和参数提取极大地增强了路由的灵活性，使得 Express 应用可以根据不同的请求路径和参数动态响应，满足复杂业务需求。
