使用 zlib 解压 Node.js 中的 .json.gz 文件时遇到问题

Trouble unzipping .json.gz file in Node.js using zlib

我正在用这个 -

在本地 Node.js 服务器上下载 this AWS S3 object
var url = "http://s3.amazonaws.com/cloudfront.s3post.cf/s3posts.json.gz";
var dest = "./s3posts.json.gz";

var download = function(url, dest, cb) {
    var file = fs.createWriteStream(dest);
    var request = http.get(url, function(response) {
        response.pipe(file);
        file.on('finish', function() {
            file.close(cb);
        });
    });
}

download(url, dest, function() {
    console.log('Download complete');
});

这成功下载了一个 .json.gz 对象。我正在尝试使用 zlib -

解压这个对象
var gunzip = zlib.createGunzip();
var rstream = fs.createReadStream('./s3posts.json.gz');
var wstream = fs.createWriteStream('./s3posts.json');
rstream.pipe(gunzip).pipe(wstream);

但是,这会引发错误并且创建的 .json 文件为空 -

events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: unexpected end of file
    at Zlib._handle.onerror (zlib.js:355:17)

奇怪的是,如果我只使用下载代码下载对象并在终端上使用 gunzip s3posts.json.gz 手动解压缩,创建的 json 文件已充满内容,我可以 运行 我的应用成功了。

我不确定为什么我可以手动解压缩,但不能使用 zlib 以编程方式执行。如果有人能指出我的错误,那将非常有帮助。

S3 对象具有以下相关元数据 -

Cache-Control: max-age=31536000,no-transform,public
Content-Encoding: gzip
Content-Type: application/json

发生的事情是您在下载 gzip 文件时没有检查错误,所以您最终保存了一个空文件。然后你尝试解压缩这个空文件,你得到一个错误,这个错误也是未处理的,你的程序崩溃了。

只需处理所有错误,您就知道出了什么问题。从您的示例中,除了 .gz 文件可能为空之外,不可能告诉您任何其他信息,因为下载显然出了问题。但是想要到底出了什么问题是个谜,因为您不检查代码中的错误。

原来我并没有等到文件下载完成才解压它;这就是生成的 json 为空的原因。我不得不使用解压文件的代码作为回调函数 -

download(url, dest, function() {
    console.log('Download complete');
    var gunzip = zlib.createGunzip();
    var rstream = fs.createReadStream('./s3posts.json.gz');
    var wstream = fs.createWriteStream('./s3posts.json');
    rstream.pipe(gunzip).pipe(wstream);
});

这也解释了为什么我能够仅使用下载代码手动解压缩文件,因为此时下载已完成,允许我在终端上成功解压缩它。