路由处理
路由是指确定应用程序如何响应客户端对特定端点的请求,每个路由可以有一个或多个处理函数。
基本路由
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('GET 请求');
});
app.post('/', (req, res) => {
res.send('POST 请求');
});
app.put('/user', (req, res) => {
res.send('PUT 请求');
});
app.delete('/user', (req, res) => {
res.send('DELETE 请求');
});
app.patch('/user', (req, res) => {
res.send('PATCH 请求');
});
路由参数
路径参数
app.get('/users/:id', (req, res) => {
res.json({ userId: req.params.id });
});
app.get('/users/:userId/books/:bookId', (req, res) => {
res.json({
userId: req.params.userId,
bookId: req.params.bookId
});
});
可选参数
app.get('/users/:id?', (req, res) => {
const id = req.params.id || 'default';
res.json({ userId: id });
});
正则表达式
app.get('/users/:id(\\d+)', (req, res) => {
res.json({ userId: req.params.id });
});
查询参数
app.get('/search', (req, res) => {
const { q, page, limit } = req.query;
res.json({
query: q,
page: page || 1,
limit: limit || 10
});
});
路由方法
app.all()
匹配所有 HTTP 方法:
app.all('/secret', (req, res, next) => {
console.log('访问 secret...');
next();
});
app.route()
链式路由处理:
app.route('/book')
.get((req, res) => {
res.send('获取图书列表');
})
.post((req, res) => {
res.send('创建图书');
})
.put((req, res) => {
res.send('更新图书');
})
.delete((req, res) => {
res.send('删除图书');
});
express.Router
模块化路由:
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('用户列表');
});
router.get('/:id', (req, res) => {
res.send(`用户详情: ${req.params.id}`);
});
router.post('/', (req, res) => {
res.send('创建用户');
});
module.exports = router;
在主应用中使用:
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);
路由中间件
const checkAuth = (req, res, next) => {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ error: '未授权' });
}
next();
};
app.get('/protected', checkAuth, (req, res) => {
res.json({ message: '受保护的路由' });
});
多个处理函数
app.get('/example',
(req, res, next) => {
console.log('第一个处理函数');
next();
},
(req, res, next) => {
console.log('第二个处理函数');
next();
},
(req, res) => {
res.send('最终响应');
}
);
路由组织最佳实践
按功能模块组织
routes/
├── index.js # 路由入口
├── users.js # 用户路由
├── products.js # 产品路由
└── orders.js # 订单路由
路由入口文件
const express = require('express');
const usersRouter = require('./users');
const productsRouter = require('./products');
const router = express.Router();
router.use('/users', usersRouter);
router.use('/products', productsRouter);
module.exports = router;
RESTful API 设计规范
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /users | 获取用户列表 |
| GET | /users/:id | 获取单个用户 |
| POST | /users | 创建用户 |
| PUT | /users/:id | 更新用户(完整) |
| PATCH | /users/:id | 更新用户(部分) |
| DELETE | /users/:id | 删除用户 |