web-dev-qa-db-ja.com

Node.js-Expressを使用して未加工のリクエスト本文を取得する

Expressを使用し、コードが次の場合:

app.use(express.bodyParser());

rawリクエスト本文を取得するにはどうすればよいですか?

59
haitao_wu

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

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


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

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

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()を呼び出すことはなく、アプリケーションをハングさせます。

最も簡単な解決策は、おそらく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

67
hexacyanide

BodyParserでverifyコールバックを使用して、bodyParserでNiceを再生するソリューションを得ました。このコードでは、これを使用してコンテンツの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(昨日、文字通り開始!)が初めてなので、このソリューションに関するコメントを聞きたいです。

38
Tiago A.

Jsonやurlencodedなどもサポートしようとしている場合、bodyParserで適切に再生されないため、これらの他の回答には注意してください。bodyParserで動作させるには、Content-Type bodyParser自体と同じように、気になるヘッダー。

Content-Type: "text/plain"を含むリクエストの生のコンテンツをreq.rawBodyに取得するには、次のようにします。

app.use(function(req, res, next) {
  var contentType = req.headers['content-type'] || ''
    , mime = contentType.split(';')[0];

  if (mime != 'text/plain') {
    return next();
  }

  var data = '';
  req.setEncoding('utf8');
  req.on('data', function(chunk) {
    data += chunk;
  });
  req.on('end', function() {
    req.rawBody = data;
    next();
  });
});
24
nortron

このソリューションは私のために働いた:

var rawBodySaver = function (req, res, buf, encoding) {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8');
  }
}

app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));

req.on('data', function(chunk) { });でソリューションを使用すると、チャンクされたリクエスト本文で動作しません。

21

これは、上記のヘキサシアニドの答えのバリエーションです。このミドルウェアは「データ」イベントも処理しますが、「次」を呼び出す前にデータが消費されるのを待ちません。このようにして、このミドルウェアとbodyParserの両方が共存し、ストリームを並行して消費します。

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

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

  next();
});
app.use(express.bodyParser());
13
oferei

body-parser を使用して、本文を次のように解析します。

app.use(bodyParser.text());

app.use(bodyParser.urlencoded());

app.use(bodyParser.raw());

app.use(bodyParser.json());

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

ボディパーサーが現在サポートしていること

0
mewc