在Node.js中使用Axios获取gzip站点地图出现Z_BUF_ERROR如何解决
问题根因
这个报错核心是Axios自动解压逻辑和手动配置的请求头冲突导致的,具体触发原因如下:
- Node.js 环境下的Axios默认会自动处理gzip/deflate/br响应的解压,同时会自动添加对应的
Accept-Encoding请求头。如果你手动指定了Accept-Encoding头,Axios会判定你要自行处理响应解压,就会关闭内置的自动解压逻辑。 - 你没有配置
responseType参数,Axios默认会把响应数据按UTF-8格式转为字符串,gzip是二进制格式,转字符串的过程会破坏原始二进制结构,后续解压时就会因为数据损坏抛出Z_BUF_ERROR文件意外结束的报错。
浏览器和Postman不会出现该问题,是因为两者都会自动识别压缩响应、完成二进制转码和解压的全流程,不会出现二进制转字符串损坏数据的情况。
修复方案
两个方案二选一即可:
- 删掉手动添加的
Accept-Encoding请求头,让Axios自动处理解压,直接就能拿到解压后的XML内容:
let response = await axios.get(`${url}/th-sitemapIndex.xml.gz`); // response.data 即为解压后的XML文本
- 如果你要自行处理解压,需要额外添加
responseType: 'arraybuffer'配置,拿到完整的二进制压缩数据再自行解压:
let response = await axios.get(`${url}/th-sitemapIndex.xml.gz`, { headers: { 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br' }, responseType: 'arraybuffer' }); // response.data 是完整的gzip二进制Buffer,可直接传入zlib解压
内容的提问来源于stack exchange,提问作者Fadi
相关产品推荐
相关产品推荐

