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

Node.js v18内置fetch连接超时错误的正确处理方式

Node.js 18内置fetch连接超时导致脚本退出的解决方法

你遇到的问题是Node.js 18内置fetch基于undici实现,连接超时时若未配置超时控制或错误捕获不完整,会导致脚本直接退出。之前使用node-fetch未出现该问题,是因为两者的超时处理逻辑存在差异。

解决方案:用AbortController手动控制超时+完整错误捕获

通过AbortController配合fetch的signal参数设置超时时间,同时确保整个异步流程被try/catch完整包裹,即可捕获超时错误并阻止脚本退出。

修改后的代码:

async function get511AK() {
  const controller = new AbortController();
  // 设置5秒超时,可根据业务需求调整时长
  const timeoutId = setTimeout(() => controller.abort(), 5000);

  try {
    const res = await fetch(URL, { 
      method: 'GET',
      signal: controller.signal // 绑定超时终止信号
    });
    
    clearTimeout(timeoutId); // 请求成功完成,清除超时定时器

    if (res.ok && res.headers.get('content-type')?.includes('json')) {
      const data = await res.json();
      jsonresponseAK = data;
    } else {
      console.log(`(${res.url}) 响应非JSON或状态异常`);
    }
  } catch (err) {
    clearTimeout(timeoutId); // 捕获到错误后,清除超时定时器避免内存泄漏
    if (err.name === 'AbortError') {
      console.log('请求超时');
    } else if (err.cause?.code === 'UND_ERR_CONNECT_TIMEOUT') {
      console.log('连接超时');
    } else {
      console.error('请求失败:', err);
    }
  }
}

关键说明

  1. AbortController的作用:这是标准Web API,通过signal传递给fetch后,超时触发时会主动终止请求并抛出AbortError,该错误可被try/catch捕获,避免脚本直接退出。
  2. 双重错误捕获:除了捕获主动超时的AbortError,还保留对undici原生的UND_ERR_CONNECT_TIMEOUT错误的判断,覆盖底层连接超时的场景。
  3. 清除定时器:无论请求成功还是失败,都要清除超时定时器,防止内存泄漏。

如果之前的try/catch无效,大概率是因为未将await fetch操作完整包裹在try块内,或者错误发生在未被捕获的异步上下文里,确保整个异步流程都在try/catch的覆盖范围内即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:06