You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Axios请求未完成却自动触发二次调用问题求助

问题排查思路
  • 定位重复请求发起方:通过浏览器开发者工具(Network面板)查看请求发起源,或检查服务端/代理(如Nginx)的访问日志,确认二次请求是客户端主动重试、代理超时重试,还是服务端内部逻辑触发。
  • 检查Axios配置:确认是否启用了axios-retry等重试插件,或手动设置了超时后重试的逻辑;默认Axios的timeout为0(无超时限制),但如果有自定义配置需核实。
  • 排查服务端框架超时:你用的是NestJS,需检查HTTP服务器的超时设置(默认可能为2分钟左右),框架会在请求超时后断开连接,可能导致客户端重试。
  • 检查代理/负载均衡超时:比如Nginx的proxy_read_timeout默认是60秒,若请求超过这个时间会被强制断开,触发客户端或代理的重试机制。
  • 核实客户端请求配置:前端若使用Axios或其他请求库,检查是否设置了超时自动重试的逻辑,部分前端框架或请求工具会默认开启超时重试。
解决建议
  1. 设置Axios超时时间
    明确为目标请求设置足够长的超时(3分钟以上),避免因Axios或底层HTTP客户端超时触发重试:

    axios.get(`http://${MICROSERVICE_HOST}:${MICROSERVICE_PORT}/SE/${rd}`, {
      headers: { token: req.cookies.token },
      timeout: 180000 // 3分钟,单位毫秒
    })
    
  2. 调整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();
    
  3. 调整代理/负载均衡超时
    若使用Nginx作为代理,修改配置文件中的超时参数:

    location / {
      proxy_pass http://your-service;
      proxy_read_timeout 180s;
      proxy_connect_timeout 180s;
      proxy_send_timeout 180s;
    }
    
  4. 禁用不必要的重试机制

    • 若使用axios-retry,确保仅在请求真正失败(如5xx错误、网络断开)时重试,而非超时就重试:
      axiosRetry(axios, {
        retryCondition: (error) => {
          return axiosRetry.isNetworkError(error) || error.response?.status >= 500;
        }
      });
      
    • 前端请求库若有默认重试逻辑,手动关闭自动重试。
  5. 优化代码结构
    避免不必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:53:30