Express.js 路由机制详解:从基础到高级应用

Express.js 路由机制详解:从基础到高级应用

expressjs.com expressjs.com 项目地址: https://gitcode.com/gh_mirrors/ex/expressjs.com

什么是路由?

在 Express.js 框架中,路由(Routing)是指确定应用程序如何响应客户端对特定端点(URI/路径)的请求。简单来说,路由就是建立URL路径与处理逻辑之间的映射关系。

基础路由示例

让我们从一个最简单的路由示例开始:

const express = require('express');
const app = express();

// 处理对根路径的GET请求
app.get('/', (req, res) => {
  res.send('欢迎来到Express世界');
});

这个例子展示了Express路由的基本结构:HTTP方法(get)、路径('/')和回调函数(处理逻辑)。

路由方法详解

Express支持所有标准HTTP方法对应的路由方法:

// GET方法路由
app.get('/products', (req, res) => {
  res.send('获取产品列表');
});

// POST方法路由
app.post('/products', (req, res) => {
  res.send('创建新产品');
});

// PUT方法路由
app.put('/products/:id', (req, res) => {
  res.send(`更新ID为${req.params.id}的产品`);
});

// DELETE方法路由
app.delete('/products/:id', (req, res) => {
  res.send(`删除ID为${req.params.id}的产品`);
});

特殊路由方法:app.all()

app.all()方法可以处理所有HTTP方法的请求:

app.all('/api', (req, res, next) => {
  console.log('访问API接口');
  next(); // 将控制权交给下一个处理器
});

路由路径的多种形式

Express支持多种形式的路径匹配:

1. 字符串路径

app.get('/about', (req, res) => {
  res.send('关于我们');
});

2. 带参数的路径

app.get('/users/:userId/posts/:postId', (req, res) => {
  res.json({
    userId: req.params.userId,
    postId: req.params.postId
  });
});

3. 正则表达式路径

// 匹配包含"book"的路径
app.get(/book/, (req, res) => {
  res.send('找到book相关路径');
});

// 匹配以"fly"结尾的路径
app.get(/.*fly$/, (req, res) => {
  res.send('匹配butterfly或dragonfly等');
});

路由处理器的多种形式

Express路由处理器可以有以下几种形式:

1. 单个回调函数

app.get('/simple', (req, res) => {
  res.send('简单路由处理');
});

2. 多个回调函数

app.get('/multi', 
  (req, res, next) => {
    console.log('第一个处理器');
    next();
  },
  (req, res) => {
    res.send('第二个处理器完成响应');
  }
);

3. 回调函数数组

const logRequest = (req, res, next) => {
  console.log(`收到请求: ${req.method} ${req.path}`);
  next();
};

const processRequest = (req, res) => {
  res.send('请求处理完成');
};

app.get('/array', [logRequest, processRequest]);

响应方法大全

Express提供了多种响应客户端的方法:

| 方法 | 描述 | 示例 | |----------------|------------------------|-----------------------------| | res.send() | 发送各种类型响应 | res.send('Hello') | | res.json() | 发送JSON响应 | res.json({success: true}) | | res.sendFile() | 发送文件 | res.sendFile('/file.pdf') | | res.redirect() | 重定向请求 | res.redirect('/new-path') | | res.render() | 渲染视图模板 | res.render('index') | | res.end() | 结束响应过程 | res.end() |

高级路由技巧

链式路由

使用app.route()创建链式路由:

app.route('/book')
  .get((req, res) => {
    res.send('获取书籍信息');
  })
  .post((req, res) => {
    res.send('添加新书籍');
  })
  .put((req, res) => {
    res.send('更新书籍信息');
  });

模块化路由

使用express.Router创建可复用的路由模块:

routes/users.js

const express = require('express');
const router = express.Router();

// 用户路由中间件
router.use((req, res, next) => {
  console.log('用户路由请求时间:', Date.now());
  next();
});

// 用户列表
router.get('/', (req, res) => {
  res.send('用户列表');
});

// 用户详情
router.get('/:id', (req, res) => {
  res.send(`用户ID: ${req.params.id}`);
});

module.exports = router;

主应用文件

const userRoutes = require('./routes/users');
app.use('/users', userRoutes);

路由参数高级用法

参数验证

app.get('/products/:id(\\d+)', (req, res) => {
  res.send(`产品ID必须为数字: ${req.params.id}`);
});

多段参数

app.get('/flights/:from-:to', (req, res) => {
  res.send(`航班从${req.params.from}到${req.params.to}`);
});

最佳实践建议

  1. 保持路由简洁:将复杂逻辑移到控制器中
  2. 使用模块化路由:大型应用应该按功能拆分路由
  3. 参数验证:始终验证路由参数
  4. 错误处理:为路由添加适当的错误处理中间件
  5. 版本控制:考虑API版本控制策略

通过掌握Express.js的路由系统,你可以构建出结构清晰、易于维护的Web应用程序。路由是Express的核心功能之一,合理设计路由结构对项目长期维护至关重要。

expressjs.com expressjs.com 项目地址: https://gitcode.com/gh_mirrors/ex/expressjs.com

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劳丽娓Fern

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值