Node.js中Axios请求未完成却自动触发二次调用问题求助
问题排查思路
- 定位重复请求发起方:通过浏览器开发者工具(Network面板)查看请求发起源,或检查服务端/代理(如Nginx)的访问日志,确认二次请求是客户端主动重试、代理超时重试,还是服务端内部逻辑触发。
- 检查Axios配置:确认是否启用了
axios-retry等重试插件,或手动设置了超时后重试的逻辑;默认Axios的timeout为0(无超时限制),但如果有自定义配置需核实。 - 排查服务端框架超时:你用的是NestJS,需检查HTTP服务器的超时设置(默认可能为2分钟左右),框架会在请求超时后断开连接,可能导致客户端重试。
- 检查代理/负载均衡超时:比如Nginx的
proxy_read_timeout默认是60秒,若请求超过这个时间会被强制断开,触发客户端或代理的重试机制。 - 核实客户端请求配置:前端若使用Axios或其他请求库,检查是否设置了超时自动重试的逻辑,部分前端框架或请求工具会默认开启超时重试。
解决建议
设置Axios超时时间
明确为目标请求设置足够长的超时(3分钟以上),避免因Axios或底层HTTP客户端超时触发重试:axios.get(`http://${MICROSERVICE_HOST}:${MICROSERVICE_PORT}/SE/${rd}`, { headers: { token: req.cookies.token }, timeout: 180000 // 3分钟,单位毫秒 })调整NestJS服务器超时
在项目的main.ts中修改HTTP服务器的超时配置,确保服务端不会提前断开长请求:async function bootstrap() { const app = await NestFactory.create(AppModule); const server = app.getHttpServer(); server.setTimeout(180000); // 设置3分钟超时 await app.listen(3000); } bootstrap();调整代理/负载均衡超时
若使用Nginx作为代理,修改配置文件中的超时参数:location / { proxy_pass http://your-service; proxy_read_timeout 180s; proxy_connect_timeout 180s; proxy_send_timeout 180s; }禁用不必要的重试机制
- 若使用
axios-retry,确保仅在请求真正失败(如5xx错误、网络断开)时重试,而非超时就重试:axiosRetry(axios, { retryCondition: (error) => { return axiosRetry.isNetworkError(error) || error.response?.status >= 500; } }); - 前端请求库若有默认重试逻辑,手动关闭自动重试。
- 若使用
优化代码结构
避免不必要的Promise嵌套,简化代码逻辑,同时确保finally逻辑正确执行:@Get("/SchemaExp/:rd") @Authorized(["admin"]) async SchemaExp(@Req() req: Request, @Param("rd") rd: string): Promise<any> { console.log("SchemaExp route: ", new Date()); try { const response = await axios.get(`http://${MICROSERVICE_HOST}:${MICROSERVICE_PORT}/SE/${rd}`, { headers: { token: req.cookies.token }, timeout: 180000 }); return response; } catch (error) { throw error; } finally { console.log("finally"); } }
内容的提问来源于stack exchange,提问作者GisCat
相关产品推荐
相关产品推荐

