node.js tar模块,'entry'可读流

时间:2013-12-03 16:53:37

标签: node.js pipe tar

如何使用来自tar模块的'entry'可读流到pipe - npmsj.org他们的内容而不会在管道中出现流错误?

这是为stream-adventure - github最后一次练习提示。

我不是在寻找答案。但提示或建议。

这是我的代码:

var zlib = require('zlib');
var tar = require('tar');
var crypto = require('crypto');
var through = require('through');

var unzip = zlib.createGunzip();
var parser = tar.Parse();
var stream = process.stdin.pipe(crypto.createDecipher(process.argv[2], process.argv[3])).pipe(unzip);
var md5 = crypto.createHash('md5', { encoding: 'hex' });

parser.on('entry', function(entry) {
  if (entry.type === 'File') {
    entry.pipe(md5).pipe(process.stdout);
    console.log(entry.path);
  }
});

unzip.pipe(parser);

这是输出:

$> stream-adventure run app
97911dcc607865d621029f6f927c7851
stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
Error: write after end
    at writeAfterEnd (_stream_writable.js:130:12)
    at Hash.Writable.write (_stream_writable.js:178:5)
    at Entry.ondata (stream.js:51:26)
    at Entry.EventEmitter.emit (events.js:117:20)
    at Entry._read (/home/n0t/stream-adventure/secretz/node_modules/tar/lib/entry.js:111:10)
    at Entry.write (/home/n0t/stream-adventure/secretz/node_modules/tar/lib/entry.js:68:8)
    at Parse._process (/home/n0t/stream-adventure/secretz/node_modules/tar/lib/parse.js:104:11)
    at BlockStream.<anonymous> (/home/n0t/stream-adventure/secretz/node_modules/tar/lib/parse.js:46:8)
    at BlockStream.EventEmitter.emit (events.js:95:17)
    at BlockStream._emitChunk (/home/n0t/stream-adventure/secretz/node_modules/tar/node_modules/block-stream/block-stream.js:145:10)

并使用verify

$> stream-adventure verify app

ACTUAL:   "97911dcc607865d621029f6f927c7851"
EXPECTED: "97911dcc607865d621029f6f927c7851 secretz/METADATA.TXT"

ACTUAL:   null
EXPECTED: "2cdcfa9f8bbefb82fb7a894964b5c199 secretz/SPYING.TXT"

ACTUAL:   null
EXPECTED: ""

# FAIL

1 个答案:

答案 0 :(得分:2)

您收到此错误是因为entry在关闭后写入md5流。关闭流后,您无法再次写入:对于md5,这很容易理解,因为您必须重置内部缓冲区,否则哈希将会出现偏差。

在您的示例中,在tar模块中的每个文件上,您将文件流传输到相同 md5流中。您只需将文件流传输到新的MD5流中;这是你如何正确地做到这一点:

parser.on('entry', function(entry) {
  if (entry.type === 'File') {
    var md5 = crypto.createHash('md5', { encoding: 'hex' });
    entry.pipe(md5).pipe(process.stdout);
    console.log(entry.path);
  }
});