问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

全局生效的中间件在 Express 中的应用

创作时间:
作者:
@小白创作中心

全局生效的中间件在 Express 中的应用

引用
CSDN
1.
https://m.blog.csdn.net/m0_62599305/article/details/145809066

在 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 应用提供更强大的功能!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号