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

如何在Cloudflare Worker中结合DecompressionStream与Response使用?

问题分析与解决方案

错误原因

  1. 响应头设置矛盾:你在响应头中声明了content-encoding: gzip,但实际上已经通过DecompressionStream将内容解压为明文。这会导致浏览器尝试对明文内容再次解压,同时流处理过程中DecompressionStream可能会尝试修改响应头(如移除编码标识),但此时响应头已发送给客户端,触发"Cannot write headers after they are sent"错误。
  2. 多余的Blob转换步骤:将fetch响应转为Blob再取流的操作,引入了额外的异步处理,可能导致流的处理时机与响应头发送时机冲突。小文件能正常运行,是因为其解压速度足够快,在响应头发送前就完成了解压,未触发冲突。

修复后的代码

const options = {
    status: 200,
    headers: {
        'content-type': 'text/plain;charset=UTF-8'
        // 移除content-encoding: gzip,内容已解压无需声明
    }
}
const ds = new DecompressionStream('gzip');
const fetchResponse = await fetch('files/test.gz');
// 直接使用原响应的body流,跳过Blob转换
const decompressedStream = fetchResponse.body.pipeThrough(ds);
return new Response(decompressedStream, options);

关键说明

  • 直接复用fetch响应的body流进行管道处理,避免了Blob转换带来的异步问题,同时提升了处理效率。
  • 移除错误的content-encoding头,确保响应头与实际内容格式一致,消除流处理时的头修改冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:47:23