Axios发送多个长耗时POST请求出现socket hang up及504错误如何解决
问题根因定位
这两类报错的本质如下:
socket hang up是TCP连接被远端主动断开,通常是服务端/网关主动关闭了未完成的请求连接504 GATEWAY TIME OUT是API层的代理/网关等待后端处理超时,主动返回的错误
你单请求正常、多请求报错,排除代码逻辑问题的话,核心为两个方向:要么第三方API存在请求频率/并发限制,要么当前HTTP客户端的配置不合理。
可行解决方案
1. 调整Axios的基础请求配置
首先给每个请求单独设置足够长的超时时间,同时禁用默认的连接复用(部分服务端对长连接的保持时间短于你单请求的耗时,第二个请求复用旧连接的时候刚好被服务端断连):
// 开头先引入依赖(Node.js环境) const http = require('http') const https = require('https') // 统一配置请求参数 const requestConfig = { headers: headers, timeout: 30 * 1000, // 设置30秒超时,远大于单请求7秒的耗时 // 禁用连接复用,每个请求使用新的TCP连接 httpAgent: new http.Agent({ keepAlive: false }), httpsAgent: new https.Agent({ keepAlive: false }) } // 调用时传入配置 const toonifyRes = await axios.post(toonifyUrl, formData, requestConfig)
2. 强制请求之间增加间隔
哪怕是串行发送,部分API会对短时间内的连续请求做限流,你可以在两个请求之间加固定的等待时间:
// 封装等待工具函数 const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)) // 第一个请求完成后,等待2秒再发第二个 await sleep(2000)
如果后续要发送更多请求,建议每次间隔设置在1~3秒,可根据实际测试结果调整。
3. 确认第三方API的限制规则
如果上面两个方案都无效,基本可以确定是第三方API的规则限制:
- 部分API会限制同一身份(相同API Key/相同IP)的并发请求数,比如同时只能处理1个请求
- 部分API会限制单位时间内的请求次数,比如1分钟最多调用3次
你可以查看API的官方文档说明,或者联系对方技术支持确认限制规则,按照规则调整请求频率即可。
额外排查点
如果你使用同一个FormData实例发送多个请求,注意FormData在Node.js中是Stream类型,第一次请求发送后流已经被消费,第二次请求发送的就是空内容,也可能导致服务端长时间等待不返回触发超时,你可以尝试每个请求都重新生成一个新的FormData实例测试。
内容的提问来源于stack exchange,提问作者sandy_yeseul
相关产品推荐
相关产品推荐

