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 中,可以通过中间件处理路由中的错误。错误处理中间件是一个带有四个参数的函数:err
、req
、res
和 next
。
示例:
// 定义一个路由,模拟抛出错误
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 路由的高级用法,包括参数化路由、嵌套路由、路由前缀、路由分组和高级路由技术。这些知识将帮助读者构建复杂且灵活的路由系统,以处理各种类型