Node.js中未显式获取响应体时,fetch是否仍会后台下载?
Node.js中fetch不读取响应体时的行为
在Node.js 18+版本中,其fetch基于undici实现,仅执行await fetch(url)获取响应头后,如果不调用response.text()/response.json()等读取响应体的方法,系统仍会在后台自动下载完整的响应体并丢弃,不会主动中止请求。这是因为fetch的默认逻辑是确保完整接收整个响应,除非你主动终止请求。
避免不必要响应体下载的解决方案
如果你仅需获取响应头、不需要响应体,可以通过AbortController主动中止请求,以此停止响应体的下载:
const controller = new AbortController(); const { signal } = controller; try { const response = await fetch(url, { signal }); if (!response.headers.get('content-type')?.includes('text/html')) { // 立即中止请求,停止下载响应体 controller.abort(); return { body: '', headers: response.headers, statusCode: response.status, url: response.url, }; } const body = await response.text(); // 处理HTML响应体的逻辑 } catch (error) { // 仅忽略中止请求引发的错误,其他错误正常抛出 if (error.name !== 'AbortError') { throw error; } }
内容的提问来源于stack exchange,提问作者Ada Boese
相关产品推荐
相关产品推荐

