我正在从电影数据库下载每日导出的 gzip 文件并使用 zlib 对其进行解压缩。当 end
事件发生时,我记录解压缩的数据字符串的长度。每次的长度都不一样。
数据似乎没有完全解压。当我开始解析文件实际包含的 JSON 时,我注意到了这一点。它会在转换每一行 JSON 时进行到一半(每一行代表一个独立的 json 对象)并因为 json 格式错误而崩溃。
var http = require('http');
var zlib = require('zlib');
var downloadUrl = "http://files.tmdb.org/p/exports/movie_ids_03_01_2018.json.gz";
http.get(downloadUrl, function(response) {
var fileContents = "";
var gunzip = zlib.createGunzip();
gunzip.on('data', function(data) {
fileContents += data.toString();
});
gunzip.on('end', function() {
console.log(fileContents.length);
});
response.pipe(gunzip);
});
我是否错误地使用了gunzip 事件?
我有一个reproducible example您可以执行以查看它的运行情况。
最佳答案
我通过替换 http
的用法解决了这个问题与 request
。我不确定我做错了什么http.get
但管道 gunzip
进入request
返回值解决了我的问题。
var request = require('request');
var zlib = require('zlib');
var fs = require('fs');
var downloadUrl = "http://files.tmdb.org/p/exports/movie_ids_03_01_2018.json.gz";
var response = request(downloadUrl);
var fileContents = "";
var gunzip = zlib.createGunzip();
gunzip.on('data', function(data) {
fileContents += data.toString();
});
gunzip.on('end', function() {
var json = fileContents.split('\n').filter(function(value, index) {
if (value == "") {
console.log(index + " is empty and skipped.");
return false;
}
return true;
});
});
response.pipe(gunzip);
我尝试使用request.get(options, function(error, response, body){});
但无法通过管道 gunzip
进入响应或正文。我是流新手,需要进行更多研究才能找出问题所在。同时,上述解决方案可以正常工作。
由于它作为 Azure 函数每天运行一次,因此像这样同步运行它并不是什么大问题。我不会阻止任何进一步的工作。
关于javascript - zlibgunzip 解压缩不同的缓冲区大小,每次在同一文件上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062337/