麻烦使用zlib在Node.js中解压缩.json.gz文件

时间:2017-04-04 17:04:06

标签: json node.js amazon-web-services amazon-s3 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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

事实证明,在解压缩之前我还没有等待文件完成下载;这就是生成的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);
});

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