zlib gunzip解压缩每个在同一文件上运行的不同缓冲区大小

时间:2018-03-02 03:20:48

标签: javascript node.js zlib gunzip

我从电影数据库下载每日导出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你可以执行以查看它是否正在运行。

1 个答案:

答案 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功能,同步运行它并不是一件大事。我没有阻止任何进一步的工作。