Express.js 中间件使用完全指南

Express.js 中间件使用完全指南

expressjs.com expressjs.com 项目地址: https://gitcode.com/gh_mirrors/ex/expressjs.com

什么是中间件?

在 Express.js 框架中,中间件(Middleware)是处理 HTTP 请求的核心机制。简单来说,中间件就是一系列处理 HTTP 请求的函数,每个函数都能访问请求对象(req)、响应对象(res)和应用程序的请求-响应循环中的下一个中间件函数(通常表示为 next)。

中间件的工作原理

Express 应用本质上是一系列中间件函数的调用链。当一个 HTTP 请求到达服务器时,它会依次通过各个中间件函数,每个函数都可以:

  1. 执行任意代码(如记录日志、验证身份等)
  2. 修改请求和响应对象
  3. 结束请求-响应周期(如直接返回响应)
  4. 调用堆栈中的下一个中间件函数

关键点:如果当前中间件函数没有结束请求-响应周期,它必须调用 next() 将控制权传递给下一个中间件函数,否则请求将被挂起。

中间件类型详解

1. 应用级中间件

应用级中间件绑定到 Express 应用实例(app 对象),使用 app.use() 和 app.METHOD() 方法加载。

基础示例

const express = require('express')
const app = express()

// 无路径中间件,对所有请求执行
app.use((req, res, next) => {
  console.log('请求时间:', Date.now())
  next()
})

// 路径匹配中间件,只对/user/:id路径的请求执行
app.use('/user/:id', (req, res, next) => {
  console.log('请求类型:', req.method)
  next()
})

// GET请求处理中间件
app.get('/user/:id', (req, res, next) => {
  res.send('用户信息')
})

中间件栈: 可以定义一系列中间件函数形成处理链:

app.use('/user/:id', 
  (req, res, next) => {
    console.log('请求URL:', req.originalUrl)
    next()
  },
  (req, res, next) => {
    console.log('请求方法:', req.method)
    next()
  }
)

跳过中间件: 使用 next('route') 可以跳过当前路由的剩余中间件:

app.get('/user/:id', (req, res, next) => {
  if (req.params.id === '0') next('route') // 跳过到下一个路由
  else next()
}, (req, res, next) => {
  res.send('普通用户')
})

app.get('/user/:id', (req, res, next) => {
  res.send('特殊用户')
})

2. 路由级中间件

路由级中间件与应用级中间件类似,但绑定到 express.Router() 实例。

示例

const router = express.Router()

router.use((req, res, next) => {
  console.log('时间:', Date.now())
  next()
})

router.get('/user/:id', (req, res, next) => {
  if (req.params.id === '0') next('route')
  else next()
}, (req, res, next) => {
  res.render('普通页面')
})

router.get('/user/:id', (req, res) => {
  res.render('特殊页面')
})

app.use('/', router)

退出路由器: 使用 next('router') 可以完全退出当前路由器实例:

router.use((req, res, next) => {
  if (!req.headers['x-auth']) return next('router')
  next()
})

3. 错误处理中间件

错误处理中间件有四个参数 (err, req, res, next),用于捕获和处理错误。

重要:必须使用四个参数,即使不使用 next 对象。

示例

app.use((err, req, res, next) => {
  console.error(err.stack)
  res.status(500).send('服务器错误!')
})

4. 内置中间件

Express 4.x 以后,内置中间件独立为模块:

  • express.static: 提供静态文件服务
  • express.json: 解析 JSON 请求体(Express 4.16.0+)
  • express.urlencoded: 解析 URL 编码的请求体(Express 4.16.0+)

5. 第三方中间件

通过 npm 安装的中间件可以扩展 Express 功能。

使用示例

npm install cookie-parser
const cookieParser = require('cookie-parser')
app.use(cookieParser())

最佳实践建议

  1. 中间件顺序很重要:按照需要的执行顺序加载中间件
  2. 合理使用路径匹配:精确指定中间件的应用路径
  3. 错误处理放在最后:确保错误处理中间件在其他中间件之后
  4. 模块化组织:将相关中间件组织为模块或数组提高可维护性

总结

Express.js 的中间件机制提供了灵活强大的请求处理能力。理解并合理使用各类中间件,可以构建出结构清晰、功能完善的 Web 应用。从简单的日志记录到复杂的业务逻辑处理,中间件都能优雅地完成。掌握中间件的使用是成为 Express 开发高手的必经之路。

expressjs.com expressjs.com 项目地址: https://gitcode.com/gh_mirrors/ex/expressjs.com

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毛彤影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值