97

Express を使用する場合、私のコードは次のとおりです。

app.use(express.bodyParser());

生のリクエストボディを取得するにはどうすればよいですか?

4

9 に答える 9

102

編集 2:ボディ パーサー モジュールのリリース 1.15.2 はraw モードを導入し、ボディをBufferとして返します。デフォルトでは、deflate と gzip 解凍も自動的に処理します。使用例:

var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));

app.get(path, function(req, res) {
  // req.body is a Buffer object
});

デフォルトでは、optionsオブジェクトには次のデフォルト オプションがあります。

var options = {
  inflate: true,
  limit: '100kb',
  type: 'application/octet-stream'
};

raw パーサーで 以外の MIME タイプを解析する場合application/octet-streamは、ここで変更する必要があります。*/*またはなどのワイルドカード マッチングもサポートし*/applicationます。


注:次の回答は、ミドルウェアがまだフレームワークにバンドルされていた Express 4 より前のバージョンに対するものです。最新の同等物は、個別にインストールする必要があるbody-parserモジュールです。

ExpressのrawBodyプロパティはかつて利用可能でしたが、バージョン 1.5.1 以降では削除されました。生のリクエスト本文を取得するには、bodyParser を使用する前にいくつかのミドルウェアを配置する必要があります。また、これに関する GitHub のディスカッションをここで読むこともできます。

app.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf8');

  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });

  req.on('end', function() {
    next();
  });
});
app.use(express.bodyParser());

そのミドルウェアは実際のデータ ストリームから読み取りrawBody、リクエストのプロパティに格納します。その後、次のように生のボディにアクセスできます。

app.post('/', function(req, res) {
  // do something with req.rawBody
  // use req.body for the parsed body
});

編集:このメソッドと bodyParser は共存を拒否しているようです。一方が他方の前にリクエスト ストリームを消費し、どちらが 2 番目に発火しないかend、したがって が呼び出されずnext()、アプリケーションがハングするためです。

最も簡単な解決策は、Connect の JSON パーサーの57 行目にある bodyParser のソースを変更することです。これは、変更されたバージョンがどのように見えるかです。

var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
  req.rawBody = buf;
  var first = buf.trim()[0];
  ...
});

ファイルは次の場所にあります。

/node_modules/express/node_modules/connect/lib/middleware/json.js.

于 2013-09-10T03:30:36.077 に答える
49

verifybodyParser のコールバックを使用して、bodyParser とうまく連携するソリューションを得ました。このコードでは、それを使用してコンテンツの sha1 を取得し、生の本文も取得しています。

app.use(bodyParser.json({
    verify: function(req, res, buf, encoding) {

        // sha1 content
        var hash = crypto.createHash('sha1');
        hash.update(buf);
        req.hasha = hash.digest('hex');
        console.log("hash", req.hasha);

        // get rawBody        
        req.rawBody = buf.toString();
        console.log("rawBody", req.rawBody);

    }
}));

私は Node.js と express.js を初めて使用したので (文字通り、昨日から始めました!)、このソリューションに関するコメントを聞きたいと思います。

于 2014-10-29T15:29:11.120 に答える
-1

body-parserを使用してください。

app.use(bodyParser.text());

app.use(bodyParser.urlencoded());

app.use(bodyParser.raw());

app.use(bodyParser.json());

すなわち。生のテキスト ファイルを取得する場合は、 を実行します.text()

それが body-parser が現在サポートしているものです

于 2019-03-27T00:19:40.707 に答える