Node.js 如何正确地从NodeJS中的一个基本流(Git Packfile)读取多个zlib流?

Node.js 如何正确地从NodeJS中的一个基本流(Git Packfile)读取多个zlib流?,node.js,zlib,inflate,nodejs-stream,Node.js,Zlib,Inflate,Nodejs Stream,我正在创建一个NodeJS模块来与git存储库交互,并且我正在尝试读取来自GitHub等公共git主机的包文件。 问题是,打包文件由许多zlib流组成,但我不知道如何: 对第一个zlib流进行充气(解压缩) 用它做点什么 为下一个zlib流充气 等等 以下是最简单的示例: // main.js const zlib = require('zlib') const Readable = require('stream').Readable; function createZlibStream

我正在创建一个NodeJS模块来与git存储库交互,并且我正在尝试读取来自GitHub等公共git主机的包文件。 问题是,打包文件由许多zlib流组成,但我不知道如何:

  • 对第一个zlib流进行充气(解压缩)
  • 用它做点什么
  • 为下一个zlib流充气
  • 等等
以下是最简单的示例:

// main.js
const zlib = require('zlib')
const Readable = require('stream').Readable;

function createZlibStream(count = 1) {
  const s = new Readable();
  s._read = () => {};
  for (let i = 0; i < count; i++) {
    s.push(zlib.deflateSync("stream" + i));
  }
  s.push(null);

  return s;
}

function readZlibStream(stream) {
  return new Promise(function(resolve, reject) {
    var data = "",
      zlibStream = zlib.createInflate();

    stream
      .pipe(zlibStream)
      .on("data", chunk => {
        data += chunk;
      })
      .on("end", () => {
        stream.unpipe(zlibStream)
        resolve(data);
      })
  });
}

var stream = createZlibStream(1)

readZlibStream(stream)
 .then(console.log)
 .catch(console.error)
与:

您将获得该输出:

user@hostname:~/zlib-error$ node main.js
stream0
events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: unexpected end of file
    at Zlib.zlibOnError [as onerror] (zlib.js:162:17)
Emitted 'error' event at:
    at Zlib.zlibOnError [as onerror] (zlib.js:165:8)
var stream = createZlibStream(2)

readZlibStream(stream)
 .then((data) => {
  console.log(data)
  readZlibStream(stream)
   .then(console.log)
   .catch(console.error)
 })
 .catch(console.error)
user@hostname:~/zlib-error$ node main.js
stream0
events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: unexpected end of file
    at Zlib.zlibOnError [as onerror] (zlib.js:162:17)
Emitted 'error' event at:
    at Zlib.zlibOnError [as onerror] (zlib.js:165:8)