老城区主干道系统不能只考虑“车顺利通过”,还要考虑:
- 车辆资料不全
- 路口不存在
- 数据库抛错
- 异步流程失败
- 你自己的代码炸了
Express 的错误处理像一套事故处理中心。
#1. 最简单的错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
message: '老城区主干道系统发生内部错误'
});
});注意这个签名:
(err, req, res, next)四个参数,少一个都不算错误处理中间件。
#2. 手动把事故上报给中心
app.get('/broken-road', (req, res, next) => {
try {
throw new Error('桥梁坍塌');
} catch (err) {
next(err);
}
});#3. 异步错误也要入链
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 不是“抛错”,而是“没这个窗口”
app.use((req, res) => {
res.status(404).json({
message: '你要去的路口不存在'
});
});#5. 正确顺序
普通中间件
↓
路由
↓
404 处理
↓
错误处理中间件如果顺序反了,就像你把事故中心修在城门外,报案车根本开不过去。
#6. 一张错误流转图
请求进入
│
├── 正常处理成功 ───────────────► 响应返回
│
└── 过程中抛错 / next(err)
│
▼
跳过后续普通中间件
│
▼
进入错误处理中间件
│
▼
返回 4xx / 5xx 响应