Superagent解析deflate压缩响应报错,如何处理?
解决Superagent解析deflate压缩响应报错的问题
方法一:禁用自动解压,手动处理原始deflate数据
服务器返回的deflate数据可能是不带zlib头的原始格式,而Superagent默认的自动解压逻辑会因格式不匹配抛出Z_DATA_ERROR。可以禁用自动解析,手动用zlib.inflateRaw处理:
const zlib = require('zlib'); request .post(url) .set('authorization', `Bearer ${token}`) .set('accept-encoding', 'deflate') .send(data) .parse((res, callback) => { let buffer = []; res.on('data', chunk => buffer.push(chunk)); res.on('end', () => { const compressed = Buffer.concat(buffer); zlib.inflateRaw(compressed, (err, result) => { if (err) return callback(err); try { // 根据实际响应格式调整解析逻辑,这里假设是JSON const parsedData = JSON.parse(result.toString()); callback(null, parsedData); } catch (parseErr) { callback(parseErr); } }); }); res.on('error', callback); }) .end((err, res) => { if (err) { console.error('处理错误:', err); return; } console.log('解析后响应:', res.body); });
方法二:覆盖默认解压配置,适配带zlib头的deflate
如果服务器返回的是标准带zlib头的deflate,可以通过修改zlib解压参数解决:
const zlib = require('zlib'); request .post(url) .set('authorization', `Bearer ${token}`) .send(data) .use(req => { req.on('response', res => { const encoding = res.headers['content-encoding']; if (encoding === 'deflate') { // 创建适配的解压流,windowBits=15对应标准deflate格式 const inflateStream = zlib.createInflate({ windowBits: 15 }); res.pipe(inflateStream); res.body = inflateStream; } }); return req; }) .end((err, res) => { if (err) { console.error('错误:', err); return; } let buffer = []; res.body.on('data', chunk => buffer.push(chunk)); res.body.on('end', () => { const content = Buffer.concat(buffer).toString(); console.log('响应内容:', content); }); });
关键提示
Z_DATA_ERROR的核心原因是解压逻辑与服务器返回的deflate格式不匹配:原始deflate用inflateRaw,带zlib头的用inflate并调整windowBits参数(-15也可强制处理原始格式)。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

