首页 > 解决方案 > 节点流绕过管道

问题描述

我正在尝试在节点中使用 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);

知道为什么处理停止并且流的其余部分按原样输出吗?

标签: javascriptnode.jsstreambase64gzip

解决方案


推荐阅读