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

使用node-fetch请求数据长时间无响应,Postman可正常返回

解决node-fetch请求大体积JSON响应卡住的问题

可能的原因及对应解决方法

1. 未设置请求超时

node-fetch v2 默认没有请求超时限制,即便服务器需要9分钟返回结果,也可能因为Node.js底层连接的隐性超时导致请求挂起。手动添加超时配置:

const fetch = require('node-fetch');

// 设置10分钟超时(比Postman的9分钟响应时长预留冗余)
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 10 * 60 * 1000);

try {
  const response = await fetch(requestData.url, {
    ...requestData.options,
    signal: controller.signal // 绑定超时信号
  });
  clearTimeout(timeoutId); // 请求成功后清除定时器
  
  // 解析响应体(注意:原代码仅获取了响应对象,未处理body)
  const data = await response.json();
  // 后续数据处理逻辑
} catch (err) {
  if (err.name === 'AbortError') {
    console.log('请求超时');
  } else {
    console.error('请求失败:', err);
  }
}

2. 未启用响应压缩

Postman默认会发送Accept-Encoding: gzip, deflate请求头,服务器返回压缩后的响应,大幅减小传输体积。而node-fetch v2 默认不自动添加该头,导致传输39MB原始JSON时耗时极长甚至卡住。手动添加压缩配置:

const response = await fetch(requestData.url, {
  ...requestData.options,
  headers: {
    ...requestData.options.headers,
    'Accept-Encoding': 'gzip, deflate'
  },
  compress: true // 启用自动解压,node-fetch会处理解压逻辑
});

3. 流式处理大响应

直接用response.json()会把整个39MB JSON加载到内存,可能引发内存压力或处理延迟,改用流式解析:

const { createGunzip } = require('zlib');
const { pipeline } = require('stream/promises');
const { parse } = require('JSONStream');

const response = await fetch(requestData.url, {
  ...requestData.options,
  headers: {
    ...requestData.options.headers,
    'Accept-Encoding': 'gzip, deflate'
  }
});

// 处理压缩流并流式解析JSON
const stream = response.body;
const decompressedStream = response.headers.get('content-encoding') === 'gzip' 
  ? stream.pipe(createGunzip()) 
  : stream;

// 按JSON片段解析(根据你的数据结构调整parse参数)
await pipeline(
  decompressedStream,
  parse('*'),
  async function* (source) {
    for await (const chunk of source) {
      // 逐个处理JSON片段
      console.log(chunk);
    }
  }
);

4. 升级node-fetch版本

node-fetch v2 对Node.js v16+的兼容性不如v3,升级到v3可优化大响应处理(注意v3为ES模块,需用import或修改package.json的type为module):

npm install node-fetch@3

CommonJS环境下的使用方式:

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

// 后续请求逻辑与之前一致,v3对大响应的处理更稳定

额外排查点

  • 检查requestData.options是否存在错误配置,比如错误的请求方法、缺失的必要请求头,导致服务器无法正常响应
  • 若内存不足,可通过node --max-old-space-size=512 your-script.js命令增大Node.js的内存限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:05