题目
中间件执行顺序与错误处理
信息
- 类型:问答
- 难度:⭐⭐
考点
中间件原理,执行顺序,错误处理
快速回答
在Express应用中,中间件执行顺序遵循声明顺序,错误处理中间件需最后声明且包含四个参数:
- 中间件按
app.use()声明顺序执行 - 错误处理中间件需定义在所有路由之后
- 必须包含
err, req, res, next四个参数 - 通过
next(err)传递错误
原理说明
Express中间件是基于洋葱模型执行的函数队列:
- 每个中间件通过
next()控制流程传递 - 错误处理中间件是特殊类型,需四个参数:
(err, req, res, next) - 当普通中间件调用
next(err)时,跳过后续普通中间件,直接进入错误处理中间件
代码示例
const express = require('express');
const app = express();
// 普通中间件
app.use((req, res, next) => {
console.log('Middleware 1');
next(); // 正常传递
});
// 模拟错误
app.get('/error', (req, res, next) => {
next(new Error('Intentional error')); // 触发错误传递
});
// 错误处理中间件(必须最后声明)
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Server Error!');
});
app.listen(3000);执行流程
- 访问
/error路由触发错误 - 错误通过
next(err)跳过后续中间件 - 引擎查找首个四参数中间件执行
最佳实践
- 顺序原则:错误处理中间件置于所有路由和普通中间件之后
- 错误传递:异步操作中使用
try/catch捕获后调用next(err) - 区分处理:根据错误类型定制HTTP状态码和响应格式
常见错误
- 顺序错误:将错误处理中间件放在路由前导致无法捕获
- 参数缺失:错误处理函数缺少
err参数被识别为普通中间件 - 未传递错误:在异步回调中抛出错误但未调用
next(err)
扩展知识
- 洋葱模型:中间件依次执行,再逆序执行
next()后的代码(若有) - 异步错误:Promise链中可用
.catch(next)传递错误 - 框架对比:Koa使用
async/await和更简洁的错误处理机制