我正在从电影数据库下载每日导出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功能,这样同步运行它并不是什么大问题。我没有阻止任何进一步的工作。