15 自定义中间件
在这一章节,我们将深入探讨如何在 Express.js 中创建和使用自定义中间件。掌握自定义中间件的技巧不仅能增强你对 Express.js 的理解,还能让你为特定需求定制应用程序的逻辑。
中间件概述
在 Express 中,中间件是一种函数,可以访问请求对象(req
)、响应对象(res
)和应用程序的请求-响应周期中的其他中间件。中间件主要用于执行操作,如执行请求数据的处理、验证用户身份、记录请求信息等。
中间件的基本结构
自定义中间件的定义相对简单。一个典型的中间件函数的结构如下:
function customMiddleware(req, res, next) {
// 处理请求
console.log("Request URL:", req.originalUrl);
// 必须调用 next() 来将控制权交给下一个中间件
next();
}
在上面的代码中,customMiddleware
是一个自定义中间件函数,next
是 Express 提供的函数,用于将控制权传递给下一个中间件。
创建并使用自定义中间件
现在,让我们来创建一个简单的自定义中间件,并将其应用到我们的 Express 应用中。
示例:请求时间戳中间件
我们将创建一个自定义中间件,它会在请求过程中记录当前的时间戳。
首先,创建一个新的 Express 应用:
const express = require('express');
const app = express();
const PORT = 3000;
然后,我们实现我们的自定义中间件:
function timestampMiddleware(req, res, next) {
req.requestTime = new Date().toISOString();
next();
}
接下来,使用 app.use()
方法传播这个中间件:
// 使用自定义中间件
app.use(timestampMiddleware);
然后,我们可以在路由处理程序中访问这个时间戳信息:
app.get('/', (req, res) => {
res.send(`请求时间: ${req.requestTime}`);
});
最后,启动服务器:
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
代码综述
完整的代码示例如下:
const express = require('express');
const app = express();
const PORT = 3000;
// 自定义中间件,记录请求时间
function timestampMiddleware(req, res, next) {
req.requestTime = new Date().toISOString();
next();
}
// 使用自定义中间件
app.use(timestampMiddleware);
// 路由处理程序
app.get('/', (req, res) => {
res.send(`请求时间: ${req.requestTime}`);
});
// 启动服务器
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
测试中间件
启动你上面的应用并在浏览器中访问 http://localhost:3000/
,你将会看到类似于以下的输出:
请求时间: 2023-10-01T12:34:56.789Z
可以看到,我们的自定义中间件成功地在请求中添加了时间戳信息。
实际应用中的自定义中间件
自定义中间件在实际开发中非常有用,以下是一些常见的应用场景:
- 请求验证:可以验证请求的用户身份,如 JWT 验证。
- 请求优化:可以在处理请求之前进行数据转换或优化。
- 日志记录:记录所有传入请求的详细信息,以便后期分析。
- 错误处理:集中处理错误并向用户返回统一的错误响应。
以下是一个验证中间件的示例:
function authMiddleware(req, res, next) {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('权限不足');
}
// 在这里验证 token 的逻辑
next();
}
// 在需要鉴权的路由中使用
app.use('/secure', authMiddleware);
结论
本节中,我们学习了如何创建和使用自定义中间件。中间件不仅能帮助我们简化代码结构,还能重用逻辑,让我们的应用更加模块化。在下一章节中,我们将深入探讨如何处理请求和响应,特别是处理 GET 请求的技巧。通过中间件与处理请求的结合,您会发现 Express.js 的强大与灵活。