如何解压(解压缩)NodeJS请求模块的gzip响应体?

85

如何解压请求模块响应中的gzip数据?

我尝试了网上的几个示例,但似乎都不起作用。

request(url, function(err, response, body) {
    if(err) {
        handleError(err)
    } else {
        if(response.headers['content-encoding'] == 'gzip') {    
            // How can I unzip the gzipped string body variable?
            // For instance, this url:
            // http://highsnobiety.com/2012/08/25/norse-projects-fall-2012-lookbook/
            // Throws error:
            // { [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' }
            // Yet, browser displays page fine and debugger shows its gzipped
            // And unzipped by browser fine...
            if(response.headers['content-encoding'] && response.headers['content-encoding'].toLowerCase().indexOf('gzip') > -1) {   
                var body = response.body;                    
                zlib.gunzip(response.body, function(error, data) {
                    if(!error) {
                        response.body = data.toString();
                    } else {
                        console.log('Error unzipping:');
                        console.log(error);
                        response.body = body;
                    }
                });
            }
        }
    }
}

3
浏览器不应该自动完成这个吗? - Shi
我添加了node.js标签,但这并不清楚...让我编辑一下帖子... - izk
你能否将数据保存到文件req.gz并从命令行解压缩它?如果可以,那么gunzip req.gzfile req.gz的输出是什么? - Andrey Sidorov
嗨,安德鲁!感谢您的建议。如果我将文件保存为“req.gz”文件,在桌面上提取它会产生一个名为“req.gz.cpgz”的文件。依次提取此文件会产生第三个名为“req 2.gz”的文件。请求正文在读取正文之前被编码为utf8(response.setEncoding('utf8'))。但是,似乎没有什么区别。我得到了相同的错误和类似的桌面文件结果。 - izk
请求3.0版本将在Node v0.10发布后自动支持此功能。 - Jonathan Ong
11个回答

1

我在nodejs中使用了gunzipSync便捷方法来解压缩主体。这避免了使用回调函数。

import * as zlib from "zlib";

const uncompressedBody:string = zlib.gunzipSync(body).toString("utf-8");

(在TypeScript中)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接