第4章 Express路由的深入理解(二)

4 路由分组

路由分组用于将相关的路由组织在一起,使代码更具模块化和可维护性。可以通过使用 express.Router 创建路由组。

示例:

const express = require('express');
const app = express();
const apiRouter = express.Router();
const userRouter = express.Router();
const productRouter = express.Router();

// 定义用户相关的路由
userRouter.get('/', (req, res) => {
    res.send('User list');
});

userRouter.get('/:id', (req, res) => {
    res.send(`User ID: ${req.params.id}`);
});

// 定义产品相关的路由
productRouter.get('/', (req, res) => {
    res.send('Product list');
});

productRouter.get('/:id', (req, res) => {
    res.send(`Product ID: ${req.params.id}`);
});

// 将用户和产品路由分别挂载到 /users 和 /products 路径
apiRouter.use('/users', userRouter);
apiRouter.use('/products', productRouter);

// 将 API 路由挂载到应用中
app.use('/api', apiRouter);

// 启动服务器
const port = 3000;
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

当用户访问 /api/users/api/products 时,将分别看到 “User list” 和 “Product list”。访问 /api/users/123/api/products/456 时,将分别看到 “User ID: 123” 和 “Product ID: 456”。

代码详解:

  • apiRouter.use('/prefix', router):将路由器挂载到 API 路由器中,并为路由器内的所有路由添加共同的前缀。
5 高级路由用法

在 Express 中,可以通过各种方法增强路由的功能,包括使用正则表达式定义路由、处理多种 HTTP 方法和使用异步函数处理路由。

1 使用正则表达式定义路由

可以使用正则表达式定义更加复杂的路由,以匹配特定的 URL 模式。

示例:

app.get(/^\/users\/(\d+)$/, (req, res) => {
    const userId = req.params[0];
    res.send(`User ID (from regex): ${userId}`);
});

当用户访问 /users/123 时,响应内容将为 “User ID (from regex): 123”。

代码详解:

  • app.get(/^\/users\/(\d+)$/, callback):使用正则表达式定义路由,匹配 /users/ 后跟一个或多个数字的 URL。
2 处理多种 HTTP 方法

可以使用 app.route 方法处理同一路径的多种 HTTP 方法。

示例:

app.route('/resource')
    .get((req, res) => {
        res.send('GET request to /resource');
    })
    .post((req, res) => {
        res.send('POST request to /resource');
    })
    .put((req, res) => {
        res.send('PUT request to /resource');
    })
    .delete((req, res) => {
        res.send('DELETE request to /resource');
    });

代码详解:

  • app.route('/path').method(callback):为同一路径定义多种 HTTP 方法的处理函数。
3 使用异步函数处理路由

可以使用异步函数处理路由,以便处理异步操作,如数据库查询或外部 API 调用。

示例:

app.get('/async', async (req, res) => {
    try {
        const data = await fetchDataFromDatabase();
        res.json(data);
    } catch (error) {
        res.status(500).send('Internal Server Error');
    }
});

async function fetchDataFromDatabase() {
    // 模拟异步数据库查询
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve({ message: 'Data fetched from database' });
        }, 1000);
    });
}

在这里插入图片描述

代码详解:

  • async (req, res):使用异步函数处理路由。
  • await fetchDataFromDatabase():等待异步操作完成。
  • res.json(data):发送 JSON 响应。
6 路由的错误处理

在 Express 中,可以通过中间件处理路由中的错误。错误处理中间件是一个带有四个参数的函数:errreqresnext

示例:

// 定义一个路由,模拟抛出错误
app.get('/error', (req, res, next) => {
    const err = new Error('Something went wrong');
    next(err); // 将错误传递给错误处理中间件
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Internal Server Error');
});

// 启动服务器
const port = 3000;
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

在这里插入图片描述

代码详解:

  • next(err):将错误传递给错误处理中间件。
  • 错误处理中间件:带有四个参数,用于处理所有传递过来的错误。

通过本章内容,读者应该能够理解并掌握 Express 路由的高级用法,包括参数化路由、嵌套路由、路由前缀、路由分组和高级路由技术。这些知识将帮助读者构建复杂且灵活的路由系统,以处理各种类型

相关推荐

  1. 4 Express深入理解(一)

    2024-07-20 20:36:02       28 阅读
  2. Vue - 工作原理(深入理解)

    2024-07-20 20:36:02       55 阅读
  3. 22-协议概述

    2024-07-20 20:36:02       35 阅读
  4. 20-IP原理

    2024-07-20 20:36:02       39 阅读
  5. 静态

    2024-07-20 20:36:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 20:36:02       145 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 20:36:02       159 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 20:36:02       133 阅读
  4. Python语言-面向对象

    2024-07-20 20:36:02       145 阅读

热门阅读

  1. CentOS7中的yum命令不可用,网络不可达

    2024-07-20 20:36:02       27 阅读
  2. HTML5的离线存储

    2024-07-20 20:36:02       27 阅读
  3. 牛客周赛51:小红走矩阵(二分+bfs)

    2024-07-20 20:36:02       32 阅读
  4. 设计模式--外观模式

    2024-07-20 20:36:02       28 阅读
  5. Kylin Cube Designer:数据洞察的魔法画布

    2024-07-20 20:36:02       24 阅读
  6. opencv读写路径包含中文的文件

    2024-07-20 20:36:02       29 阅读
  7. 探索Web世界:WebKit的地理位置API

    2024-07-20 20:36:02       33 阅读
  8. OpenCV从基础到入门(基于python)

    2024-07-20 20:36:02       26 阅读
  9. 运维 | Linux 系统中 MySQL 的安装与使用记录

    2024-07-20 20:36:02       26 阅读
  10. GPT-4o 与 GPT-4o Mini:两者的区别和特点

    2024-07-20 20:36:02       31 阅读