跳到主要内容

路由处理

路由是指确定应用程序如何响应客户端对特定端点的请求,每个路由可以有一个或多个处理函数。

基本路由

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删除用户