← 中文资源

简体中文版本

HTTP 500 Internal Server Error — 定位真正成因

诊断 HTTP 500:用请求 id 关联服务端日志、安全地暴露堆栈,并排除下游依赖失败。

阅读英文原文

症状

请求返回 500 Internal Server Error 且正文为通用信息。部分请求成功,说明进程存活,失败仅与某条代码路径或依赖相关。

诊断

用请求 id 关联日志并检查依赖:

app.use((req, res, next) => {
  req.id = crypto.randomUUID();
  next();
});
process.on('unhandledRejection', (err) => console.error(err));

在请求 id 下记录堆栈,仅返回通用信息。

修复

集中处理错误并保护依赖:

app.use((err, req, res, next) => {
  console.error({ id: req.id, err: err.stack });
  res.status(500).json({ error: 'internal', id: req.id });
});

为数据库与 HTTP 调用加入超时。

验证

重放失败的请求;它成功,且其请求 id 对应的日志中不再含异常,确认底层成因已解决。