全书目录

第十二篇:Express 完全指南 —— 老城区主干道宇宙

第十二章:错误处理 —— 事故处理中心和应急广播

1 分钟 330 字 第 250 / 962 个阅读单元

老城区主干道系统不能只考虑“车顺利通过”,还要考虑:

  • 车辆资料不全
  • 路口不存在
  • 数据库抛错
  • 异步流程失败
  • 你自己的代码炸了

Express 的错误处理像一套事故处理中心。

#1. 最简单的错误处理中间件
js
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({
    message: '老城区主干道系统发生内部错误'
  });
});

注意这个签名:

js
(err, req, res, next)

四个参数,少一个都不算错误处理中间件。

#2. 手动把事故上报给中心
js
app.get('/broken-road', (req, res, next) => {
  try {
    throw new Error('桥梁坍塌');
  } catch (err) {
    next(err);
  }
});
#3. 异步错误也要入链
js
app.get('/api/roads/:id', async (req, res, next) => {
  try {
    const road = await getRoadById(req.params.id);
    res.json(road);
  } catch (err) {
    next(err);
  }
});

在现代 Express 项目里,返回 Promise 的处理器如果抛错,通常也会进入错误处理链;但如果你接手的是老旧项目,保持显式 try/catch + next(err) 仍然是最稳妥的工程习惯。

#4. 404 不是“抛错”,而是“没这个窗口”
js
app.use((req, res) => {
  res.status(404).json({
    message: '你要去的路口不存在'
  });
});
#5. 正确顺序
text
普通中间件
  ↓
路由
  ↓
404 处理
  ↓
错误处理中间件

如果顺序反了,就像你把事故中心修在城门外,报案车根本开不过去。

#6. 一张错误流转图
text
请求进入
  │
  ├── 正常处理成功 ───────────────► 响应返回
  │
  └── 过程中抛错 / next(err)
               │
               ▼
        跳过后续普通中间件
               │
               ▼
        进入错误处理中间件
               │
               ▼
        返回 4xx / 5xx 响应