如何在快递中压缩POST请求数据?

时间:2013-04-03 09:12:38

标签: node.js express gzip

我正在尝试构建一个可以接受带有express的gzip压缩POST数据的服务器。我想我可以编写自己的中间件来将请求流传递给zlib.createGunzip()流。问题是,我怎样才能实现这一点,之后,express.bodyParser()中间件仍然可以解析我的枪杀的POST数据?

我尝试用zlib流替换原始请求流方法,但这只是使bodyParser返回“错误请求”错误:

var express = require('express');
var app = express();

function gUnzip(req, res, next) {
  var newReq;
  if (req.headers['content-encoding'] === 'gzip') {
    console.log("received gzipped body");
    newReq = req.pipe(zlib.createGunzip());
    Object.getOwnPropertyNames(newReq).forEach(function (p) {
      req[p] = newReq[p];
    });
  }
  next();
}

app.use(gUnzip);
app.use(express.bodyParser());

app.listen(8080);

有没有办法在不重写我自己的中间件中的bodyParser()中间件的情况下完成这项工作?

编辑: 这是同一个问题:Unzip POST body with node + express。但是在答案中他只是在他自己的中间件中做了express.bodyParser()应该做什么,这是我想要避免的。我正在寻找一种方法来简单地从流中解压缩请求数据,然后将其传递给bodyParser(),它需要一个流本身,如http://www.senchalabs.org/connect/json.html所示。

2 个答案:

答案 0 :(得分:1)

压缩请求正文通常不会被使用,因为您无法轻松协商客户端和服务器之间的内容编码(我相信还有另一个stackoverflow问题)。大多数服务器不支持压缩请求体,并且您真正需要它的唯一时间是客户端将发送大型主体的API。

body-parser,特别是raw-body,不支持它,因为用例是如此之小,尽管我已经添加了它。现在,你必须创建你的身体解析器。幸运的是,这很容易,因为你可以只分叉body-parser并利用raw-body。您将在https://github.com/expressjs/body-parser/blob/master/index.js#L80附近添加的主要代码:

    var zlib = require('zlib')

        var stream
        switch (req.headers['content-encoding'] || 'identity') {
            case 'gzip': 
                stream = req.pipe(zlib.createGunzip())
                break
            case 'deflate': 
                stream = req.pipe(zlib.createInflate())
                break
            case 'identity': 
                break
            default:
                var err = new Error('encoding not supported')
                err.status = 415
                next(err)
                return
        }

        getBody(stream || req, {
            limit: '1mb',
            // only check content-length if body is not encoded
            length: !stream && req.headers['content-length'],
            encoding: 'utf8'
        }, function (err, buf) {

        })

答案 1 :(得分:-2)

您是否尝试过使用内置的compress中间件。它记录在expressjs reference documentation

app.use(express.compress());

也许你可以在这里找到有用的东西:Unzip POST body with node + express