如何延长node-fetch默认超时时间以适配长响应API?
解决node-fetch请求长响应API的超时问题
你遇到的问题是node-fetch默认遵循Node.js http/https模块的10分钟(600000ms)超时限制,而目标API需要15分钟响应,导致请求中断。以下是两种可行的解决方案:
方案1:升级node-fetch到v3+,直接设置超时参数
node-fetch从v3版本开始支持在请求选项中直接指定timeout参数,可以轻松设置更长的超时时间:
const fetch = require("node-fetch"); try { const response = await fetch(`https://someurl/?id=${id}`, { timeout: 900000 // 15分钟,单位:毫秒 }); // 处理响应逻辑 } catch (error) { console.error(error); }
方案2:使用v2版本时,结合AbortController与全局Agent超时设置
如果无法升级node-fetch版本,需要同时修改Node.js http/https模块的全局超时限制,再用AbortController手动控制请求超时:
步骤1:修改全局Agent超时
在代码开头添加以下配置,覆盖http和https请求的默认超时:
const http = require('http'); const https = require('https'); // 设置http请求默认超时为15分钟 http.globalAgent.options.timeout = 900000; // 设置https请求默认超时为15分钟 https.globalAgent.options.timeout = 900000;
步骤2:用AbortController控制请求超时
const fetch = require("node-fetch"); try { const controller = new AbortController(); // 15分钟后触发终止信号 const timeoutTimer = setTimeout(() => controller.abort(), 900000); const response = await fetch(`https://someurl/?id=${id}`, { signal: controller.signal }); clearTimeout(timeoutTimer); // 请求成功后清除定时器 // 处理响应逻辑 } catch (error) { console.error(error); }
关键说明
你之前找到的Promise.race方法无法解决问题的核心原因:即使你设置了更长的Promise超时,Node.js http模块的10分钟默认超时依然会主动中断请求,必须修改全局Agent的超时参数才能覆盖这个底层限制。
内容的提问来源于stack exchange,提问作者user567
相关产品推荐
相关产品推荐

