Express.js 中间件使用完全指南
expressjs.com 项目地址: https://gitcode.com/gh_mirrors/ex/expressjs.com
什么是中间件?
在 Express.js 框架中,中间件(Middleware)是处理 HTTP 请求的核心机制。简单来说,中间件就是一系列处理 HTTP 请求的函数,每个函数都能访问请求对象(req)、响应对象(res)和应用程序的请求-响应循环中的下一个中间件函数(通常表示为 next)。
中间件的工作原理
Express 应用本质上是一系列中间件函数的调用链。当一个 HTTP 请求到达服务器时,它会依次通过各个中间件函数,每个函数都可以:
- 执行任意代码(如记录日志、验证身份等)
- 修改请求和响应对象
- 结束请求-响应周期(如直接返回响应)
- 调用堆栈中的下一个中间件函数
关键点:如果当前中间件函数没有结束请求-响应周期,它必须调用 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())
最佳实践建议
- 中间件顺序很重要:按照需要的执行顺序加载中间件
- 合理使用路径匹配:精确指定中间件的应用路径
- 错误处理放在最后:确保错误处理中间件在其他中间件之后
- 模块化组织:将相关中间件组织为模块或数组提高可维护性
总结
Express.js 的中间件机制提供了灵活强大的请求处理能力。理解并合理使用各类中间件,可以构建出结构清晰、功能完善的 Web 应用。从简单的日志记录到复杂的业务逻辑处理,中间件都能优雅地完成。掌握中间件的使用是成为 Express 开发高手的必经之路。
expressjs.com 项目地址: https://gitcode.com/gh_mirrors/ex/expressjs.com
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考