# 路由系统

URL: https://caijiao.org/express/chapter2/2-routing
Source: docs/express/chapter2/2-routing.md
Description: 本章节讲解 Express 路由系统，介绍路由的定义方法、路由参数处理以及如何组织模块化路由，帮助你灵活管理应用请求。

Express 路由系统是处理客户端请求的核心机制。它根据请求的 URL 和 HTTP 方法，将请求分发到对应的处理函数。

## 路由的定义

使用 `app.METHOD(path, handler)` 定义路由，`METHOD` 是 HTTP 动词，如 GET、POST、PUT、DELETE 等。

```js
app.get('/user', (req, res) => {
  res.send('获取用户信息');
});

app.post('/user', (req, res) => {
  res.send('创建新用户');
});
````

## 路由路径支持多种模式

* **字符串路径**
  例如 `/about`、`/user/profile`

* **路径参数**
  使用冒号 `:` 定义动态参数：

```js
app.get('/user/:id', (req, res) => {
  res.send(`用户 ID 是：${req.params.id}`);
});
```

* **正则表达式**
  可以使用正则匹配路径：

```js
app.get(/^\/ab?cd$/, (req, res) => {
  res.send('正则匹配路径');
});
```

## 查询参数

通过 `req.query` 访问 URL 中的查询字符串参数：

例如请求 URL: `/search?keyword=express`

```js
app.get('/search', (req, res) => {
  res.send(`搜索关键词是：${req.query.keyword}`);
});
```

## 路由方法链

可以为同一路径绑定多个处理函数：

```js
app.route('/book')
  .get((req, res) => {
    res.send('获取书籍列表');
  })
  .post((req, res) => {
    res.send('添加新书籍');
  });
```

## 模块化路由

将路由拆分到独立模块，使用 `express.Router()` 管理：

```js
const express = require('express');
const router = express.Router();

router.get('/list', (req, res) => {
  res.send('用户列表');
});

module.exports = router;
```

主应用引入并使用：

```js
const userRouter = require('./routes/user');
app.use('/user', userRouter);
```

## 总结

Express 路由系统灵活强大，支持多种路径匹配方式和请求方法，结合中间件机制能实现复杂的请求处理逻辑。
