查看: 135|回复: 1

Express中间件详解:核心作用、分类与实战代码示例

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在Node.js的Express框架中,中间件是一个核心概念。简单来说,中间件是一个函数,它拦截HTTP请求,在请求到达路由处理之前或响应发送给客户端之前执行一些逻辑操作。Express应用的整个请求处理过程本质上是一条中间件链——每个请求都会依次经过这些中间件函数,最后到达路由处理器(如果有的话)。

1. 中间件的标准形式与核心作用

中间件函数接收三个参数:req(请求对象)、res(响应对象)、next(下一个中间件函数)。典型写法如下:
  1. function middleware(req, res, next) {
  2.   // 处理逻辑:如请求解析、身份校验、日志记录等
  3.   next(); // 将控制权传递给下一个中间件或路由
  4. }
复制代码

核心作用主要有两点:

- 在请求到达具体路由之前执行操作(如解析请求体、校验Token、添加请求头)。
- 在响应发送之前执行操作(如记录日志、压缩响应、添加CORS头)。

通过next()函数,中间件可以决定是否继续往下传递。如果不调用next(),请求会挂起;如果调用next(err),则直接跳转到错误处理中间件。

2. 中间件的五大分类

2.1 应用程序级中间件

通过app.use()挂载到Express应用实例上,作用于全局或匹配特定路径。常用于统一处理:JSON解析、日志、安全验证等。
  1. const express = require('express');
  2. const app = express();
  3. // 内置中间件:解析JSON请求体
  4. app.use(express.json());
  5. // 自定义全局日志中间件
  6. app.use((req, res, next) => {
  7.   console.log(`[${Date.now()}] ${req.method} ${req.url}`);
  8.   next();
  9. });
复制代码

2.2 路由级中间件

挂载在express.Router()实例上,仅作用于当前路由模块,适合模块化组织业务逻辑。
  1. const router = express.Router();
  2. // 路由级中间件:仅对/users模块生效
  3. router.use((req, res, next) => {
  4.   console.log('进入用户模块');
  5.   next();
  6. });
  7. // 将路由挂载到应用上,路径前缀为/users
  8. app.use('/users', router);
复制代码

2.3 错误处理中间件

专门捕获并处理错误,必须接收四个参数:err、req、res、next。当任何中间件或路由调用next(err)时,Express会跳过所有普通中间件,直接执行这个错误处理中间件。
  1. app.use((err, req, res, next) => {
  2.   res.send({
  3.     status: 1,
  4.     msg: err instanceof Error ? err.message : err,
  5.   });
  6. });
复制代码

注意:错误处理中间件必须放在所有路由之后定义,否则无法捕获到错误。

2.4 内置中间件

Express原生提供,无需额外安装,直接通过express.xxx()使用。常见的有:

- express.static('public'):托管静态资源文件。
- express.json():解析Content-Type为application/json的请求体。
- express.urlencoded({ extended: true }):解析URL-encoded格式的请求体(通常是表单提交数据)。

2.5 第三方中间件

由社区开发,通过npm安装,扩展Express功能。

- cors:解决跨域问题。
- multer:处理文件上传。
- express-validator:数据验证。
- morgan:HTTP请求日志记录。

这些中间件一般遵循相同的(req, res, next)签名,使用前安装并导入即可:
  1. const cors = require('cors');
  2. app.use(cors());
复制代码

3. 实战要点与理解

- 中间件顺序至关重要:Express按代码顺序执行中间件。全局中间件(如JSON解析、日志)应放在最前面,路由中间件在中间,错误处理中间件放在最后。
- 每个中间件必须调用next()或发送响应(如res.json()),否则请求会挂死。
- 内置中间件express.json()和express.urlencoded()分别处理JSON和表单数据,若同时需要两者,都需注册。

掌握这些分类与用法,就能灵活地利用中间件机制进行模块化、可复用的Express应用开发。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Express中间件详解:核心作用、分类与实战代码示例

楼主的分享非常详细清晰,从中间件的基础概念到五大分类都讲得很透彻,特别是错误处理中间件要放在路由后面这个细节,新手很容易忽略。代码示例也很实用,配合文字说明一目了然。想问一下,实际项目中如果同时用`app.use(express.json())`和`app.use(express.urlencoded(...))`,顺序有没有讲究?还是先注册哪个都行?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-12 23:07 , Processed in 0.037347 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部