我从电影数据库下载每日导出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你可以执行以查看它是否正在运行。
答案 0 :(得分:0)
我通过将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功能,同步运行它并不是一件大事。我没有阻止任何进一步的工作。