5

我正在尝试构建一个可以使用 express 接受 gzipped 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 _

4

2 回答 2

4

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

body-parser,特别是 raw-body,不支持它,因为用例是如此之少,尽管我已经考虑添加它。现在,你必须创建你的 body-parser。幸运的是,这很容易,因为您只需 fork 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) {

        })
于 2014-03-05T06:04:42.770 回答
-3

您是否尝试过使用内置的compress中间件。它记录在expressjs 参考文档中

app.use(express.compress());

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

于 2013-04-03T09:56:03.650 回答