Node.js文件系统:可读流中没有调用结束事件

8

我正在尝试解压缩一个.tar文件(从目录打包而来),然后检查提取目录中文件的名称。我正在使用tar-fs来提取tar文件,然后使用fs.createReadStream来处理数据。以下是我的代码:

fs.createReadStream(req.files.file.path)
  .pipe(tar.extract(req.files.file.path + '0'))
  .on('error', function() {
    errorMessage = 'Failed to extract file. Please make sure to upload a tar file.';
  })
  .on('entry', function(header, stream, callback) {
    console.error(header);
    stream.on('end', function() {
      console.error("this is working");
    });
  })
  .on('end', function() {
    //the one did not get called
    console.error('end');
  })
;

我希望能够提取整个文件夹,然后检查文件名。嗯,我还没有做到那一步...
据我所知,在管道之后,我得到了一个可读流。可读流有一个结束事件?我的问题是,为什么代码中的 "end" 事件没有被调用?
谢谢!
1个回答

15

监听可写流的 finish 事件。当调用 end() 并完成数据流入时触发此事件。更多信息请参见 此处

.on('finish', function() {
  console.error('end');
})

嗨@hassansin,感谢您的指导!还有一个问题,“完成”和“结束”事件分别来自父Writable和Readable类。第一句话是说Writable使用finish,Readable使用end,对吗?“完成”事件在调用.end()并且所有块都经过_transform处理后触发,而“结束”事件在所有数据输出后触发,这是在调用_flush回调之后。那么如果它们属于不同的事物,为什么finish会在end之后触发呢?这对像我这样的新手来说很困惑。非常感谢。 - odieatla
1
finishtar.extract()关联,它是一个可写流。该可写流在内部基于tar文件中文件数量维护了多个entry stream。因此,当所有的entry文件都被写入磁盘且为它们发出end事件时,写入器最终发出finish事件。 - hassansin
好的,我想我可能明白了。所以在所有流的end被发出后,才会发出finish - odieatla
双工流怎么办,即可读可写:stream.end()应该调用end还是finish回调函数?当这种流既没有写入也没有读取时,我需要知道预期的行为。 - martin-g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接