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

Node.js 20 Fetch API处理大XML响应时response.text()挂起/超时问题

Node.js 20 Fetch API处理大XML响应问题解决

一、是否是响应体大小导致的问题?

你的判断大概率是对的——小响应正常、大响应(900KB+)挂起/超时的强相关性,已经指向响应体大小是核心诱因。可以通过两个操作进一步确认:

  • 检查服务器返回的响应头,若存在Transfer-Encoding: chunked,需确认服务器分块传输是否完整;
  • 临时将大响应截断至900KB以内,验证是否能正常解析,明确大小对请求的影响。

二、处理大XML响应的替代方案

response.text()会一次性将整个响应体加载到内存,大内容易引发内存占用过高或流处理阻塞,推荐以下两种替代方案:

方案1:手动读取响应流拼接文本

直接处理response.body的ReadableStream,逐段读取并拼接,避免一次性加载全部内容:

try {
  const headers = {
    "Content-Type": 'text/xml'    
  }

  const req_options = {
    method: "GET",
    headers: headers
  };    

  const fetch_response = await fetch(req_url, req_options);
  console.log("fetch_response status: ", fetch_response.status);

  if (fetch_response.status >= 200 && fetch_response.status < 300) {
    const reader = fetch_response.body.getReader();
    const decoder = new TextDecoder('utf-8');
    let result = '';

    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      result += decoder.decode(value, { stream: true });
    }
    // 完成最后一次解码,确保所有内容处理完毕
    result += decoder.decode();
    
    console.log(result);
    return result;
  } else {
    console.log("Request error");
    return "";
  }
} catch (error) {
  console.log(error);
  return { success: false, error: error };
}

方案2:使用流式XML解析器(内存更高效)

若最终目的是解析XML而非单纯获取文本,推荐用支持流的XML解析库(如sax-js),无需拼接完整文本即可处理,内存占用更低:
先安装依赖:

npm install sax-js

再实现流式解析:

const sax = require('sax');

try {
  const headers = {
    "Content-Type": 'text/xml'    
  }

  const req_options = {
    method: "GET",
    headers: headers
  };    

  const fetch_response = await fetch(req_url, req_options);
  console.log("fetch_response status: ", fetch_response.status);

  if (fetch_response.status >= 200 && fetch_response.status < 300) {
    const parser = sax.createStream(true, { trim: true });
    // 按需绑定解析事件,处理XML节点
    parser.on('opentag', (node) => {
      console.log('开始节点:', node.name);
    });
    parser.on('text', (text) => {
      console.log('文本内容:', text);
    });
    parser.on('end', () => {
      console.log('XML解析完成');
    });

    // 将响应流导入解析器
    await fetch_response.body.pipeTo(new WritableStream({
      write(chunk) {
        parser.write(chunk);
      },
      close() {
        parser.close();
      }
    }));

    return { success: true };
  } else {
    console.log("Request error");
    return "";
  }
} catch (error) {
  console.log(error);
  return { success: false, error: error };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:34:52