使用 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);
});
这也解释了为什么我能够仅使用下载代码手动解压缩文件,因为此时下载已完成,允许我在终端上成功解压缩它。
我正在用这个 -
在本地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);
});
这也解释了为什么我能够仅使用下载代码手动解压缩文件,因为此时下载已完成,允许我在终端上成功解压缩它。