首页 > 解决方案 > 如何从 NodeJS 中的一个基本流(Git Packfile)中正确读取多个 zlib 流?

问题描述

我正在创建一个 NodeJS 模块来与 git 存储库进行交互,并且我正在尝试读取来自 GitHub 等公共 git 托管的 Packfile。问题是,Packfiles 由许多 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)

读取 1 个流很酷,但是如果您生成两个流,请替换:

var stream = createZlibStream(1)

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

和:

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)

标签: node.jszlibinflatenodejs-stream

解决方案


推荐阅读