收录了这篇文章
Express 是一个基于 Node.js 的 web 应用程序框架,它提供了一系列强大特性来简化 web 应用的开发,其中路由系统是其核心组件之一。Express 的路由允许你定义如何响应客户端对不同 URL 和 HTTP 方法(如 GET、POST 等)的请求。下面是一些基础概念和使用示例:
基础路由设置
在 Express 中,你可以直接在应用级别定义路由,或者通过 express.Router 创建模块化的、可重用的路由处理器。
应用级别路由
const express = require('express');
const app = express();
// 定义一个 GET 路由
app.get('/', (req, res) => {
res.send('Hello World!');
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
使用 Router
为了组织和分离关注点,经常使用 Router 创建可重用的路由模块。
// 创建一个路由处理器
const express = require('express');
const router = express.Router();
// 在路由器上定义路由
router.get('/', (req, res) => {
res.send('This is the root route of the router.');
});
router.get('/users', (req, res) => {
res.send('List of users');
});
// 导出路由器
module.exports = router;
然后,在主应用中使用这个路由器:
const express = require('express');
const app = express();
const userRouter = require('./userRouter');
// 使用路由器
app.use('/api/users', userRouter);
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
路由参数
Express 支持路由参数,这对于动态路由非常有用。
router.get('/users/:id', (req, res) => {
const userId = req.params.id;
res.send(`User details for ID: ${userId}`);
});
HTTP 方法支持
Express 支持所有标准的 HTTP 方法,包括 GET, POST, PUT, DELETE, OPTIONS, HEAD 等。你可以根据需要定义对应的处理函数。
高级主题
在掌握了Express的基础路由设置后,探索更高级的功能可以帮助你构建更复杂、更高效的应用。以下是一些Express路由高级教程的主题:
1. 路由分组与命名空间
使用express.Router()可以创建模块化的路由处理,进一步地,你可以通过路由分组来组织相关路由,为它们提供共同的前缀和中间件。
const express = require('express');
const userRouter = express.Router();
userRouter.get('/', ...);
userRouter.get('/:id', ...);
const adminRouter = express.Router();
adminRouter.use(authenticateAdmin); // 为admin路由添加特定中间件
adminRouter.get('/dashboard', ...);
const app = express();
app.use('/users', userRouter); // 用户相关的路由
app.use('/admin', adminRouter); // 管理员相关的路由
2. 路由参数与约束
路由参数不仅限于简单的占位符,还可以添加正则表达式作为约束,以匹配特定格式的参数。
router.get('/user/:id([0-9]+)', (req, res) => {
2 // 只匹配数字ID
3});
3. 路由中间件与链式处理
在路由定义中,可以连续使用多个中间件处理请求,实现请求的预处理、后处理或错误处理。
router.get('/example', middleware1, middleware2, (req, res) => {
// 处理逻辑
});
4. 路由优先级与排序
虽然Express官方文档没有明确说明路由的优先级,但路由定义的顺序决定了其优先级。更具体的路由应该放在前面,通用路由应置于后面。
5. 路由重定向
可以使用res.redirect()来实现路由之间的重定向。
router.get('/old-route', (req, res) => {
res.redirect('/new-route');
});
6. 错误处理路由
通过定义错误处理中间件,可以集中处理特定路由或全局的错误。
// 全局错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
// 特定路由的错误处理
router.get('/error-prone-route', (req, res, next) => {
try {
// 可能抛出错误的逻辑
} catch (err) {
next(err); // 将错误传递给下一个错误处理中间件
}
}, errorHandler); // 自定义错误处理中间件
7. RESTful 路由设计
遵循REST原则设计路由,确保路由清晰、语义化。
router
.get('/api/users', listUsers) // 获取用户列表
.post('/api/users', createUser) // 创建新用户
.get('/api/users/:id', getUserById) // 获取单个用户详情
.put('/api/users/:id', updateUser) // 更新用户信息
.delete('/api/users/:id', deleteUser); // 删除用户
8. 路由的模块化与分离
将不同功能的路由分别放在不同的文件中,然后在主应用中引入并挂载,有助于大型项目的维护和团队协作。
9. 动态路由与嵌套路由
利用嵌套路由可以创建层级更深的API结构,适合多级资源的管理。
10. 路由的条件判断
在中间件中,可以使用条件语句来根据请求的属性动态改变路由行为。
掌握这些高级技巧,能够帮助你更高效地设计和维护Express应用中的路由系统。
修改时间 2024-05-29