侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

中间件执行顺序与错误处理

2025-12-6 / 0 评论 / 4 阅读

题目

中间件执行顺序与错误处理

信息

  • 类型:问答
  • 难度:⭐⭐

考点

中间件原理,执行顺序,错误处理

快速回答

在Express应用中,中间件执行顺序遵循声明顺序,错误处理中间件需最后声明且包含四个参数:

  1. 中间件按app.use()声明顺序执行
  2. 错误处理中间件需定义在所有路由之后
  3. 必须包含err, req, res, next四个参数
  4. 通过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);

执行流程

  1. 访问/error路由触发错误
  2. 错误通过next(err)跳过后续中间件
  3. 引擎查找首个四参数中间件执行

最佳实践

  • 顺序原则:错误处理中间件置于所有路由和普通中间件之后
  • 错误传递:异步操作中使用try/catch捕获后调用next(err)
  • 区分处理:根据错误类型定制HTTP状态码和响应格式

常见错误

  • 顺序错误:将错误处理中间件放在路由前导致无法捕获
  • 参数缺失:错误处理函数缺少err参数被识别为普通中间件
  • 未传递错误:在异步回调中抛出错误但未调用next(err)

扩展知识

  • 洋葱模型:中间件依次执行,再逆序执行next()后的代码(若有)
  • 异步错误:Promise链中可用.catch(next)传递错误
  • 框架对比:Koa使用async/await和更简洁的错误处理机制