1. ホーム
  2. node.js

[解決済み] Node.js - Expressを使用して生のリクエストボディを取得する

2023-01-16 02:04:26

質問

Expressを使用していて、コードが

app.use(express.bodyParser());

どのようにすれば 生のリクエストボディ ?

どのように解決するのですか?

2を編集します。 リリース1.15.2のボディパーサモジュールは 生モード を導入し、これはボディを バッファ . デフォルトでは、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'
};

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


注意 以下の回答は、ミドルウェアがまだフレームワークにバンドルされていた Express 4 よりも前のバージョンに対応するものです。現代の同等のものは ボディパーサー モジュールで、これは別途インストールする必要があります。

rawBody プロパティはかつて Express にありましたが、バージョン 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は共存を拒否しているようです。なぜなら、どちらかが先にリクエストストリームを消費してしまい、どちらか一方が起動しないことになるからです。 end を決して起動せず、したがって next() を呼び出すことはなく、アプリケーションを停止させます。

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

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 .