全局生效的中间件在 Express 中的应用
全局生效的中间件在 Express 中的应用
在 Express 应用中,中间件(middleware)是指在请求和响应之间处理逻辑的函数。它们用于对请求进行处理、修改、验证,或者在请求响应过程中执行其他操作。通常,中间件可以作用于特定路由,但有时我们可能希望中间件在整个应用中都生效。这样,无论请求访问哪个路由,都能经过相同的中间件处理。
本文将介绍如何在 Express 中使用 全局生效的中间件 ,并展示一些常见的应用场景。
1. 什么是中间件?
在 Express 中,中间件是一个具有三个参数的函数:
function (req, res, next) {
// 中间件逻辑
}
req
:请求对象,包含客户端发送的请求数据。res
:响应对象,供开发者返回响应给客户端。next
:一个函数,调用它表示当前中间件已经完成,控制权可以传递给下一个中间件。如果没有调用next()
,请求将不会继续处理。
2. 全局生效的中间件概念
全局生效的中间件是指在 Express 应用中,所有的 HTTP 请求都会经过的中间件,而不仅仅是某一个特定的路由。你可以通过 app.use()
方法来设置全局中间件,这样它将在整个应用中生效。
app.use()
会将中间件应用于所有路由,意味着无论是访问网站的根路径 /
还是其他任何路径,都会先经过这些中间件。
app.use((req, res, next) => {
// 逻辑代码
next(); // 调用 next() 继续执行后续中间件或路由
});
2.1 全局中间件的使用场景
- 日志记录 :记录所有请求的详细信息(如请求方法、路径、时间等)。
- 身份验证 :在请求处理之前检查用户是否已经登录,进行身份验证。
- 请求数据解析 :解析请求体中的数据,尤其是 JSON 或 URL 编码的请求体。
- 跨域资源共享(CORS) :处理跨域请求并添加适当的响应头。
- 错误处理 :捕获所有的错误并返回统一的错误响应。
3. 创建全局中间件
3.1 记录日志
一个常见的全局中间件是记录每个请求的日志。通过这种方式,我们可以追踪所有进入服务器的请求。
const express = require('express');
const app = express();
// 全局中间件:记录每个请求的日志
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // 继续传递给下一个中间件
});
// 示例路由
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
每次访问 http://localhost:3000
时,服务器都会打印请求的时间、方法和路径。
输出示例:
[2025-02-23T08:00:00.000Z] GET /
3.2 身份验证中间件
全局身份验证中间件确保用户在访问任何受保护的路由之前已登录。你可以检查请求头中的 Authorization
字段,或者根据需要验证 cookie/session。
app.use((req, res, next) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Forbidden: No token provided');
}
// 在此验证 token...
next(); // 如果验证成功,继续处理请求
});
3.3 解析请求体
对于 POST 请求,可能会有请求体数据。如果你希望全局解析所有请求体(如 JSON 或 URL 编码的数据),可以使用内置中间件:
// 使用 Express 的内置中间件解析 JSON 格式的请求体
app.use(express.json());
// 使用 Express 的内置中间件解析 URL 编码的请求体
app.use(express.urlencoded({ extended: true }));
app.post('/submit', (req, res) => {
const formData = req.body;
res.send(`Received data: ${JSON.stringify(formData)}`);
});
3.4 设置跨域资源共享(CORS)
跨域资源共享(CORS)中间件可以使得你的应用支持从不同的域进行访问,适用于前端和后端分离的应用场景。你可以全局添加 CORS 头部。
const cors = require('cors');
// 使用 CORS 中间件,允许所有域的请求
app.use(cors());
// 你也可以根据需求限制允许的域名
// app.use(cors({
// origin: 'https://example.com'
// }));
3.5 错误处理中间件
虽然错误处理中间件一般是应用于所有路由的最后,但是它也是一种全局中间件。它会捕获应用中的所有错误,避免每个路由单独处理。
// 全局错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack); // 打印错误栈
res.status(500).send('Something went wrong!');
});
这个中间件必须有四个参数:err
, req
, res
, next
。当有错误发生时,它会被自动调用,并返回一个统一的错误响应。
4. 全局中间件的顺序
中间件的执行顺序是按它们在代码中的定义顺序来处理的。Express 会按顺序依次执行中间件,直到处理完请求或出现错误。如果你希望某个中间件在其他中间件之前执行,可以将其放在上面:
// 全局中间件
app.use((req, res, next) => {
console.log('First middleware');
next();
});
// 其他路由或中间件
app.use((req, res, next) => {
console.log('Second middleware');
next();
});
// 路由
app.get('/', (req, res) => {
res.send('Hello, World!');
});
当访问根路径时,输出将会是:
First middleware
Second middleware
确保你按正确的顺序安排中间件,尤其是错误处理中间件,它通常应当放在所有路由和其他中间件的后面。
5. 总结
全局中间件在 Express 中是一个非常重要的概念,它能够为所有路由和请求提供一致的处理逻辑。通过合理使用全局中间件,你可以实现以下功能:
- 记录请求日志
- 实现身份验证
- 解析请求数据
- 处理跨域请求
- 统一错误处理
理解并使用好全局中间件,能够使你的 Express 应用更加灵活、强大,同时减少重复代码,提高可维护性。
希望本文能帮助你更好地理解和使用 Express 中的全局中间件,为你的 Web 应用提供更强大的功能!