Express 路由教程
Node.js 教程
收录了这篇文章

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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Node.js test 模块
CSRF 双重 Cookie 验证
MySQL 的 sql_mode 模式介绍:为什么 MySQL 中 int,float,double 类型字段插入空字符时自动转为0
Git 从远程仓库拉取代码覆盖本地代码
JavaScript screen对象
CSS3 实现 Switch 开关
JavaScript 检查 Date 是否为 Invalid Date
Notifications API