javascript - 节点流绕过管道
问题描述
我正在尝试在节点中使用 HTTPs 端点的响应。响应数据被json
编码base64
并压缩在gzip
. 这就是我的做法:
const zlib = require('zlib');
const base64 = require('base64-stream');
. . .
const options = {
hostname: '',
port: 443,
path: '/api/1/endpoint',
method: 'POST',
headers: {
'Accept': 'application/json',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9,fr;q=0.8',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body)
}
}
const request = https.request(options);
request.on('response', (response) => {
output = fs.createWriteStream(filename);
// this is how I handle the response
response.pipe(zlib.createGunzip()).pipe(base64.decode()).pipe(output);
}
request.on("error", (err) => {
console.log("Error: " + err.message);
});
// write data to request body
request.write(body);
request.end();
问题是输出文件没有完全解压,第一部分是json,剩下的是gzip二进制:
"id" : "4"
}, {
"id" : "18"
} ],
"id" : "0048598-001",
"version" : 2228230,
"name" : "name-01- isи????????̸??(???????ф????(???????ѕ????Q??%????(???????ѕ???Ј?耉?????????Ʌ????̈?(???????х???耉?ɽ???(????????ɕ?ѕ???耈???ܴ?????P????????h??(????????ɕ?ѕ? 䈀耉????ͅ??ɼ???Ʌ?????????????(???????????ѕ???耈?????Դ??P????????h??(???????????ѕ? 䈀耉????
现在,如果我base64
从管道中删除解码(即pipe(base64.decode())
),我会得到一条大base64
线(即解压缩成功),我可以使用命令从 CLI 解码base64
。
response.pipe(zlib.createGunzip()).pipe(output);
知道为什么处理停止并且流的其余部分按原样输出吗?