向node.js服务器发送POST中的GZIPed数据时出错

向node.js服务器发送POST中的GZIPed数据时出错,node.js,post,gzip,Node.js,Post,Gzip,My Node.js服务器需要在POST请求中接收大量压缩JSON(gzip)数据。我已经在文章的有效负载中添加了一些代码,但是结果总是不正确的,并且根据发布的JSON的大小而有所不同 var http = require('http'); var zlib = require('zlib'); var port = process.env.port || 1337; http.createServer(function(req, res) { if (req.method == '

My Node.js服务器需要在POST请求中接收大量压缩JSON(gzip)数据。我已经在文章的有效负载中添加了一些代码,但是结果总是不正确的,并且根据发布的JSON的大小而有所不同

var http = require('http');
var zlib = require('zlib');

var port = process.env.port || 1337;

http.createServer(function(req, res) {
    if (req.method == 'POST') {
        if( req.headers['content-encoding'] == 'gzip' ) {
            var body = [];

            req.on('data', function (data) {
                console.log('Receiving data...');
                body.push(data);
            });

            req.on('end', function () {
                console.log('Data received! Uncompressing...');

                var buffer = Buffer.concat(body);
                zlib.gunzip(buffer, function(err, result) {
                    if (!err) {
                        console.log('Unzipped!!')
                        var r = result.toString();
                        console.log(r)
                        res.writeHead(200, { 'Content-Type': 'application/json' });
                        res.end(r);
                    } else {
                        console.log(err);
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end('Something went wrong!');
                    }
                });              
            });
        }
        else {
            console.log('Everything OK with uncompressed requests!');
            res.writeHead(200, { 'Content-Type': 'text/plain' });
            res.end('Some JSON was received!\n');
        }

        req.on('error', function(err){
            console.log(err);
            res.writeHead(500, { 'Content-Type': 'text/plain' });
            res.end('Something went wrong!');
        });
    }
    else {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Hello World\n');        
    }
}).listen(1337);
如果我发送普通的、未压缩的JSON数据,一切正常

压缩的结果是:

{“id”:1,“name”:“Gabe”}
->返回500,但有错误:错误的头检查]错误号:-3,代码:“Z_DATA_Error”,尝试解压缩数据时。正如在一篇评论中指出的,这并不是不正确的行为,因为有效负载太小,无法压缩

{“id”:1,“name”:“Gabe”,“age”:33,“address”:“555路,市,省”,“职业”:“我用代码换钱”}
->请求在
请求之后突然以504结尾。('data'…
),尽管该过程继续并显示正确的未压缩数据,如下所示

{“id”:1,“姓名”:“Gabe”,“年龄”:666,“地址”:“666路,市,省”,“职业”:“我白天睡觉,晚上写代码……不是”}
->它被卡在接收数据上,什么也不做

为了进行测试,我已将Fiddler配置为在内容编码头设置为以下内容时发送压缩数据:

示例请求:

POST http://localhost:1337/ HTTP/1.1
User-Agent: Fiddler
Content-Encoding: gzip
Host: localhost:1337

{"id":1,"name":"Gabe","age":00,"address":"555 Road, City, Province","occupation":"I exchange code for money"}
我尝试侦听错误并使用域,但没有看到生成任何错误。我还尝试使用Express手动执行此操作,并使用支持GZIP和Deflate的模块执行此操作,行为相同。使用节点0.10.18和0.10.30进行测试,不使用Express,最后使用Express 3和4进行测试


那么,这到底是怎么回事?我是不是太瞎了以至于在某个地方漏掉了一个冒号?这是节点中的一个错误吗?这是我用Fiddler发送请求的方式吗?

您在最后发布的示例请求中看起来并没有
gzip
d数据;看起来仍然是纯JSON。您只是展示了未压缩的JSON是什么吗应该是,或者这真的是Fiddler发送给node的吗?@MikeS。Fiddler负责gziping JSON并添加其规则。如果您查看屏幕截图,原始请求仅显示一组字符,这是压缩的有效负载。啊,是的,我明白了。好的,只是重复检查:)在您给出的示例中,{“id”:1,“name”:“Gabe”}不应该被压缩,因为它小于50字节,您可以在fiddler中检查它。你能检查一下抛出Z_DATA_错误的原因吗?@user568109它抛出的原因是,正如你所说的,它没有被压缩,代码示例试图解压它,因为我发送了带有内容编码头的请求。我认为这个例子有误导性,我不妨把它去掉。谢谢你的观察!
POST http://localhost:1337/ HTTP/1.1
User-Agent: Fiddler
Content-Encoding: gzip
Host: localhost:1337

{"id":1,"name":"Gabe","age":00,"address":"555 Road, City, Province","occupation":"I exchange code for money"}