为什么 'finish' 事件没有在此 Node.js 代码中触发?

Why isn't the 'finish' event firing in this Node.js code?

这里是 Node 新手。我正在尝试下载一个 .tar.xz 文件并通过下面显示的代码将其解压缩到一个目录中:

var request = require('request');
var tar = require('tar');
var xz = require('xz');

function downloadRaw(url, callback)
{
    return request({
        encoding: null,
        url: url
    }, callback);
}

function extractToDirectory(url, directory, callback)
{
    return downloadRaw(url)
        .pipe(new xz.Decompressor())
        .pipe(tar.Extract(directory))
        .on('finish', callback);
}

出于某种原因,tar 流上的 'finish' 事件似乎没有触发,即使在它完成提取存档内容之后也是如此。 tar 是一个由 npm 自己维护的库,所以我假设我在这里犯了某种错误。无论如何,为什么会发生这种情况,我该如何解决?

我看到 downloadRaw 需要一个回调,但你从来没有传递给它,所以你传递了一个未定义的值给请求函数。

如果您想使用流式传输 api,则不要将回调传递给这些函数中的任何一个。

事实上,为什么要费心使用那个原始函数。为什么不这样做:

return request(url)
.pipe(newxz.Decompressor())
.pipe(tar.Extract(directory))
 .on('finish', callback);

结果是 error 事件触发了,但 finish 事件没有触发。这修复了它:

function extractToDirectory(url, directory, callback)
{
    return downloadRaw(url)
        .pipe(new xz.Decompressor())
        .pipe(tar.Extract(directory))
        .on('error', callback)
        .on('finish', callback);
}