Express中间件返回5XX状态码时自动重试问题咨询
问题原因分析
这种重试行为不是Express本身的机制,而是来自客户端/代理的HTTP重试策略,核心逻辑如下:
- 5XX状态码属于「服务器端错误」,代表服务器临时故障、处理失败但可能下次能成功。对于幂等请求(比如GET、HEAD、PUT、DELETE这类重复执行不会改变服务器状态的请求),绝大多数HTTP客户端(浏览器、curl、反向代理/负载均衡器)都会默认发起重试,期望服务器恢复正常后能处理成功。
- 4XX状态码属于「客户端错误」,代表请求本身有问题(比如参数错误、权限不足),重试也无法解决问题,所以客户端不会发起重试。
结合你的代码来看:
你的请求是GET /,属于典型的幂等请求。当错误处理中间件返回500时,客户端收到服务器错误的响应,就会自动重试这个GET请求,导致你的M1中间件被重复执行1-2次;而返回400时,客户端识别是自己的请求问题,不会重试。
验证方法
- 用
curl -v http://localhost:9000发起请求,查看日志里是否有多次请求记录 - 把请求改成POST(非幂等请求),即使返回5XX,客户端也不会重试——因为重复POST可能会产生重复的资源变更
内容的提问来源于stack exchange,提问作者LifeIsButifool
相关产品推荐
相关产品推荐

