在node.js中使用zlib时检查标头不正确

Thu*_*wan 31 zlib node.js

我正在尝试发送一个简单的HTTP POST请求,检索响应正文.以下是我的代码.我正进入(状态

错误:标头检查不正确

在"zlib.gunzip"方法中.我是node.js的新手,我很感激任何帮助.

;

    fireRequest: function() {

    var rBody = '';
    var resBody = '';
    var contentLength;

    var options = {
        'encoding' : 'utf-8'
    };

    rBody = fSystem.readFileSync('resources/im.json', options);

    console.log('Loaded data from im.json ' + rBody);

    contentLength = Buffer.byteLength(rBody, 'utf-8');

    console.log('Byte length of the request body ' + contentLength);

    var httpOptions = {
        hostname : 'abc.com',
        path : '/path',
        method : 'POST',
        headers : {
            'Authorization' : 'Basic VHJhZasfasNWEWFScsdfsNCdXllcjE6dHJhZGVjYXJk',
            'Content-Type' : 'application/json; charset=UTF=8',
            // 'Accept' : '*/*',
            'Accept-Encoding' : 'gzip,deflate,sdch',
            'Content-Length' : contentLength
        }
    };

    var postRequest = http.request(httpOptions, function(response) {

        var chunks = '';
        console.log('Response received');
        console.log('STATUS: ' + response.statusCode);
        console.log('HEADERS: ' + JSON.stringify(response.headers));
        // response.setEncoding('utf8');
        response.setEncoding(null);
        response.on('data', function(res) {
            chunks += res;
        });

        response.on('end', function() {
            var encoding = response.headers['content-encoding'];
            if (encoding == 'gzip') {

                zlib.gunzip(chunks, function(err, decoded) {

                    if (err)
                        throw err;

                    console.log('Decoded data: ' + decoded);
                });
            }
        });

    });

    postRequest.on('error', function(e) {
        console.log('Error occured' + e);
    });

    postRequest.write(rBody);
    postRequest.end();

}
Run Code Online (Sandbox Code Playgroud)

Nit*_*ked 18

response.on('data', ...)可以接受一个Buffer,而不只是简单的字符串.连接时你正在转换为字符串不正确,然后不能gunzip.你有2个选择:

1)收集数组中的所有缓冲区,并在end事件中使用它们进行连接Buffer.concat().然后在结果上调用gunzip.

2)使用.pipe()并将响应传递给gunzip对象,如果希望将结果存储在内存中,则将其输出传递给文件流或字符串/缓冲区字符串.

这里讨论了选项(1)和(2):http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression