5

gzip された POST データを Express で受け入れることができるサーバーを構築しようとしています。リクエスト ストリームを zlib.createGunzip() ストリームにパイプする独自のミドルウェアを作成するだけでよいと思います。問題は、その後、express.bodyParser() ミドルウェアがガンジップされた POST データを解析できるようにするにはどうすればよいかということです。

元のリクエスト ストリーム メソッドを zlib ストリームのメソッドに置き換えようとしましたが、bodyParser が「Bad Request」エラーを返すようになりました。

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() ミドルウェアを書き直さずにこれを機能させる方法はありますか?

編集: これは同じ質問です: POST 本文を node + express で解凍します。しかし、答えでは、彼は自分のミドルウェアで、express.bodyParser() がすべきことを行うだけです。これは私が避けたいことです。http://www.senchalabs.org/connect/json . html .

4

2 に答える 2

4

圧縮されたリクエストボディは、クライアントとサーバーの間でコンテンツエンコーディングを簡単にネゴシエートできないため、通常は使用されません (それについては別のスタックオーバーフローの質問があると思います)。ほとんどのサーバーは圧縮されたリクエスト ボディをサポートしていません。本当に必要なのは、クライアントが大きなボディを送信する API の場合だけです。

body-parser、特にraw-bodyは、ユースケースが非常に最小限であるため、サポートしていませんが、追加することは考えています。ここでは、body-parser を作成する必要があります。幸いなことに、body-parser を fork して 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 に答える