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); } } }
关键说明
- AbortController的作用:这是标准Web API,通过
signal传递给fetch后,超时触发时会主动终止请求并抛出AbortError,该错误可被try/catch捕获,避免脚本直接退出。 - 双重错误捕获:除了捕获主动超时的
AbortError,还保留对undici原生的UND_ERR_CONNECT_TIMEOUT错误的判断,覆盖底层连接超时的场景。 - 清除定时器:无论请求成功还是失败,都要清除超时定时器,防止内存泄漏。
如果之前的try/catch无效,大概率是因为未将await fetch操作完整包裹在try块内,或者错误发生在未被捕获的异步上下文里,确保整个异步流程都在try/catch的覆盖范围内即可。
内容的提问来源于stack exchange,提问作者phuz
相关产品推荐
相关产品推荐

