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

Axios请求报错read ECONNRESET,本地正常DEV/UAT异常原因排查

ECONNRESET错误排查:本地正常但DEV/UAT环境请求失败

问题背景

本地开发环境向远程服务器发起HTTP POST登录请求可正常获取响应,但部署到DEV和UAT服务器后,触发read ECONNRESET错误,报错堆栈:

Error: read ECONNRESET
    at TLSWrap.onStreamRead (internal/stream_base_commons.js:209:20)
    at TLSWrap.callbackTrampoline (internal/async_hooks.js:131:17)

使用NestJS HttpService封装的请求代码如下:

async login(): Promise<string | undefined> {
    try {
      const result = await lastValueFrom(
        this.httpService.post(
          `${this.apiUrl}/login`,
          {
            email: this.configService.get('EMAIL'),
            password: this.configService.get('PASSWORD'),
          },
          {
            headers: {
              'Content-Type': 'application/json',
            },
          },
        ),
      );

      this.logger.log(
        `[login] result: ${result}`,
      );

      return result.data.token;
    } catch (error) {
      this.logger.error('can not login');
      this.logger.error(error);
    }
  }

已将目标URL加入网络白名单,但问题未解决,需排查是代码端还是基础设施端问题。

可能原因分析

基础设施端问题

  • 白名单规则不完整:仅添加URL白名单不足以放行,可能存在端口限制(如远程服务使用非标准HTTPS端口)、出口IP段限制(DEV/UAT服务器的公网IP未被远程服务允许)、WAF/防火墙的其他拦截规则(如请求频率、请求特征触发防护)。
  • 网络链路不稳定:DEV/UAT到远程服务的链路存在丢包、延迟过高,或中间节点主动断开空闲连接,导致TCP连接被重置。
  • 代理配置缺失/错误:本地依赖代理可正常访问,但DEV/UAT服务器未配置对应代理,或代理地址、认证信息有误,导致请求无法到达目标服务。
  • TLS版本不兼容:DEV/UAT服务器的Node.js版本过旧,支持的TLS协议版本(如TLS 1.0/1.1)被远程服务禁用,连接建立时被重置。

代码端问题

  • 超时配置缺失:未设置请求超时时间,当网络响应缓慢时,连接被远程或中间节点强制断开。可添加超时参数:
    {
      headers: { 'Content-Type': 'application/json' },
      timeout: 10000 // 10秒超时
    }
    
  • 环境配置错误:DEV/UAT环境下apiUrl配置错误(如域名解析错误、路径拼写错误),或EMAIL/PASSWORD存在特殊字符未转义,导致请求格式异常,远程服务主动断开连接。
  • 连接复用异常:Axios默认开启TCP连接复用,高请求频率下可能出现连接复用失效,触发ECONNRESET。可尝试禁用连接复用:
    import * as http from 'http';
    import * as https from 'https';
    
    // ...
    {
      headers: { 'Content-Type': 'application/json' },
      httpAgent: new http.Agent({ keepAlive: false }),
      httpsAgent: new https.Agent({ keepAlive: false })
    }
    
  • 日志信息不足:当前日志仅打印错误,未记录请求的完整URL、请求体、错误的详细上下文(如error.request、error.response),无法定位具体失败原因。

排查步骤

  1. 在服务器端直接测试:在DEV/UAT服务器上用curl发起相同请求,验证网络连通性:
    curl -X POST -H "Content-Type: application/json" -d '{"email":"你的邮箱","password":"你的密码"}' 目标完整URL
    
    • 若curl失败:确定为基础设施问题,联系网络团队排查链路、防火墙、IP白名单。
    • 若curl成功:聚焦代码端配置,检查环境变量、Axios参数。
  2. 核对环境配置:确认DEV/UAT环境的apiUrl、EMAIL、PASSWORD与本地完全一致,无拼写或格式错误。
  3. 增强日志输出:在catch块中添加详细日志:
    catch (error) {
      this.logger.error('登录失败,请求详情:', {
        url: `${this.apiUrl}/login`,
        requestBody: { email: this.configService.get('EMAIL'), password: '***' },
        errorCode: error.code,
        errorMessage: error.message,
        request: error.request,
        response: error.response
      });
    }
    
  4. 检查Node.js版本:对比本地与DEV/UAT的Node.js版本,若差异较大,测试升级Node.js是否解决TLS兼容问题。

内容的提问来源于stack exchange,提问作者ThavinV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:13:27