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

Node.js fetch遇deflate编码时部分页面抛出TypeError问题排查

问题分析与解决方案

这个错误的核心原因是Node.js的fetch默认解压缩逻辑无法识别服务器返回的压缩算法,下面分点说明原因和对应解决办法:

1. 先确认服务器使用的压缩类型

首先你需要明确服务器返回的响应到底用了什么压缩算法,这能帮你定位问题。可以用curl命令查看响应头:

curl -I -H "Accept-Encoding: gzip, deflate, br" https://www.giant-bicycles.com/de/glory-advanced-rahmenset-2024

重点看Content-Encoding字段的值,如果返回的是gzip/deflate/br之外的类型(比如某些小众压缩算法或非标准参数配置),那就是Node.js默认不支持该格式导致的错误。

2. 明确指定支持的压缩算法(优先方案)

不要直接禁用压缩,而是在请求头里明确告诉服务器只返回Node.js支持的压缩类型:

const response = await fetch('https://www.giant-bicycles.com/de/glory-advanced-rahmenset-2024', {
  headers: {
    'Accept-Encoding': 'gzip, deflate, br'
  }
});
const text = await response.text();

Node.js的fetch(基于undici库)原生支持这三种压缩格式,这样服务器会优先返回这些兼容的压缩类型,避免返回无法解析的格式。

3. 升级Node.js版本尝试修复

你当前使用的Node.js 20.x版本虽然稳定,但某些压缩算法的边缘场景支持可能在后续小版本中被修复。可以尝试升级到最新的20.x稳定版(比如20.12.x)或21+版本,看是否能解决该问题。

4. 手动处理响应流(兜底方案)

如果上面的方法都无效,你可以手动获取响应流,用Node.js内置的zlib库手动处理解压缩:

import { createGunzip, createInflate, brotliDecompress } from 'zlib';

const response = await fetch('https://www.giant-bicycles.com/de/glory-advanced-rahmenset-2024');
const encoding = response.headers.get('Content-Encoding');

let text = '';
if (encoding) {
  let decompressStream;
  switch (encoding) {
    case 'gzip':
      decompressStream = createGunzip();
      break;
    case 'deflate':
      decompressStream = createInflate();
      break;
    case 'br':
      decompressStream = brotliDecompress();
      break;
    default:
      // 遇到不支持的编码,回退到不压缩的方式
      text = await response.text();
  }

  if (decompressStream) {
    const reader = response.body.pipeThrough(decompressStream).getReader();
    const decoder = new TextDecoder();
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      text += decoder.decode(value, { stream: true });
    }
    text += decoder.decode();
  }
} else {
  text = await response.text();
}

结论

大概率是服务器返回了Node.js默认解压缩器不支持的压缩格式,优先通过指定Accept-Encoding头限制压缩类型来解决;如果问题依旧,尝试升级Node.js版本;最后可以用手动处理响应流的方式兜底。

内容的提问来源于stack exchange,提问作者Code Spirit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:22:49