web-dev-qa-db-ja.com

ボディパーサーはexpressとは何ですか?

body-parserを使わなくてもデータを取得できるため、Expressアプリケーションでbody-parserが必要な理由はわかりません。そしてそれは実際には何をしているのでしょうか?

236
jiten

Express.js バージョン4以降でHTTP POSTリクエストを処理するには、body-parserというミドルウェアモジュールをインストールする必要があります。

body-parserは、着信要求ストリームの本文部分全体を抽出し、それをreq.bodyに公開します。

ミドルウェアは以前はExpress.jsの一部でしたが、今は別にインストールする必要があります。

このbody-parserモジュールは、HTTP POSTリクエストを使用して送信されたJSON、バッファ、文字列、およびURLエンコードデータを解析します。以下に示すように、NPMを使用してbody-parserをインストールします。

npm install body-parser --save

2019年4月2日に編集: [email protected]で、body-parserミドルウェアはexpressにバンドルされています。 詳細はこれを見てください

163
Malatesh Patil

はい、body-parserがなくても作業できます。あなたがそれを使わないとき、あなたは生のリクエストを得ます、そしてあなたのボディとヘッダはリクエストパラメータのルートオブジェクトにありません。あなたは個々に全てのフィールドを操作しなければならないでしょう。

エクスプレスチームが保守しているので、body-parserを使用することもできます。

ボディパーサーがあなたにできること:それは要求を単純化します。
使い方:例を示します。

npm install body-parser --saveをインストールする

これはexpressでbody-parserを使う方法です:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

リンク。

https://github.com/expressjs/body-parser

41
Himanshu sharma

答え ここ それを非常に詳細にそして華麗に説明しなさい、答えは含まれています:

要するに; body-parser は入ってくるリクエストストリームのボディ部分全体を抽出し、それをより簡単なインターフェースとしてreq.bodyに公開します。あなたはそれを必要としません、あなたがそれのすべてをあなた自身ですることができるので。しかし、それはたぶんあなたが望むことをし、あなたに悩みを救うでしょう。


もう少し詳しく説明します。 body-parserは nodejs/zlib を使用して着信要求データをzip形式で解凍し、 stream-utils/raw-body を使用して要求本体の生の内容全体を待つミドルウェアを提供します。それをパースする "(これはあなたがリクエストボディを使用しないのであれば、あなたはしばらく時間を無駄にしたことを意味する。).

生のコンテンツを入手した後、body-parserは使用することに決めた特定のミドルウェアに応じて、4つの戦略のうちの1つを使用してそれを解析します。

  • bodyParser.raw() :実際に本文を解析するのではなく、バッファリングされたコンテンツを前の Bufferreq.bodyで公開するだけです。

  • bodyParser.text() :バッファをプレーンテキストとして読み込み、結果の文字列をreq.bodyに公開します。

  • bodyParser.urlencoded() :テキストをURLエンコードデータとして解析し(これにより、ブラウザは通常のフォームからPOSTに設定されたフォームデータを送信する傾向があります)、結果のオブジェクト(キーと値を含む)をreq.bodyに公開します。比較のために。 PHPでは、これらすべてが自動的に行われ、$_POSTに公開されます。

  • bodyParser.json() :テキストをJSONとして解析し、結果のオブジェクトをreq.bodyに公開します。

req.bodyを望ましい内容に設定した後に初めて、スタック内の次のミドルウェアを呼び出します。これにより、解凍して解析する方法を考えなくても要求データにアクセスできます。

あなたはそれらのドキュメントを読むために body-parser github を参照することができます、それはその動作に関する情報を含んでいます。

39
Suraj Jain

これを技術的でないものにしてみましょう。

たとえば、あなたがHTML形式のデータをnode-jsサーバーに送信しているとします。つまり、サーバーにリクエストを送信したとします。サーバーファイルはリクエストオブジェクトの下にリクエストを受け取ります。論理的に言うと、コンソールでこのリクエストオブジェクトをサーバーファイルに記録すると、フォームデータのどこかにフォームデータが表示されるはずです。あなたは実際にそうではありません!

それで、我々のデータはどこにありますか?リクエストに含まれていない場合、どのように抽出しますか。

これに対する簡単な説明は、httpがあなたのフォームデータをそれらが目的地に到着するときに組み立てられるように意図されたビットと小片で送るということです。だからあなたはどのようにあなたのデータを抽出するのだろうか。

しかし、毎回手作業でデータのチャンクを解析してそれを組み立てるというこのような苦労をする必要はありません。あなたのためにこれをするだろう「ボディパーサー」と呼ばれるものを使用してください。

body-parserはあなたのリクエストを解析し、それをあなたが必要とするかもしれない関連情報を簡単に抽出できるフォーマットに変換します。

たとえば、フロントエンドにサインアップフォームがあるとしましょう。あなたはそれを記入していて、どこかに詳細を保存するようにサーバーに要求しています。

あなたの要求からユーザー名とパスワードを抽出することはあなたがbody-parserを使うならば以下のように簡単になります。

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

つまり基本的に、body-parserはあなたの入ってきたリクエストを解析し、あなたのフォームデータを含むチャンクを組み立て、それからあなたのためにこのbodyオブジェクトを作成し、そしてあなたのフォームデータでそれを埋めました。

22
Abzy

HTTPリクエストボディを解析します。これは通常、ヒットしたURLだけでなく、必要な情報が本文に含まれているPOSTまたはPUT PATCH HTTP要求のコンテキストで知る必要がある場合に必要です。

基本的にはJSON、プレーンテキストを解析するための、または必要に応じて処理するための生のBufferオブジェクトを返すためのミドルウェアです。

9
Deepak Patidar

これらはすべて便利な問題です。

基本的に、もし質問が「body-parserを使うために、私たちは を必要としますか でしたか?」であれば。答えはノーだ'。一般的に柔軟性が低く、同じ情報を取得するために記述しなければならないコードの量が増える、より遠回りのないルートを使用してclient-post-requestから同じ情報を思いつくことができます。

これは、「最初にexpressを使用するには need を使用しますか?」と質問するのと同じです。繰り返しますが、答えはありません。また、expressの基本的な機能を実行するためにコードを追加する手間を省くことができます。

表面上 - body-parserを使用すると、生のデータストリームをキャプチャして情報の形式を把握するのではなく、クライアントの要求に含まれる情報をさまざまな形式で簡単に取得できます。 。

7
Rich Werden

投稿データにアクセスするには、body-parserを使用する必要があります。基本的にexpressが本体を読み、それを解析して理解できるJsonオブジェクトにすることを可能にするbody-parserとは何ですか。

7
Satish Kuppili

リクエストボディを理解する

POSTまたはPUT要求を受信するとき、要求本文はアプリケーションにとって重要である場合があります。ボディデータを取得することは、リクエストヘッダーにアクセスするよりも少し複雑です。ハンドラーに渡される要求オブジェクトは、ReadableStreamインターフェースを実装します。このストリームは、他のストリームと同様に、他の場所でリッスンまたはパイプできます。ストリームの「データ」イベントと「終了」イベントをリッスンすることで、ストリームから直接データを取得できます。

各「データ」イベントで発行されるチャンクはバッファです。文字列データになることがわかっている場合は、配列でデータを収集し、「最後」でデータを連結して文字列化するのが最善です。

let body = [];
request.on('data', (chunk) => {
  body.Push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

body-parserを理解する

そのドキュメントに従って

ハンドラーの前に、req.bodyプロパティーで使用可能なミドルウェアの着信要求本文を解析します。

最初の例で見たように、本文を抽出するには、着信要求ストリームを手動で解析する必要がありました。異なるタイプのフォームデータが複数ある場合、これは少し面倒です。したがって、このタスクをすべて内部で実行するbody-parserパッケージを使用します。

さまざまなタイプのデータを解析するための4つのモジュールを提供します

生のコンテンツボディパーサーにデータを解析させるために、上記の戦略のいずれか(使用することに決めたミドルウェアに応じて)を使用します。それらのドキュメントを読むことで、それらについてさらに読むことができます。

req.bodyを解析された本体に設定した後、body-parserはnext()を呼び出してスタックの次のミドルウェアを呼び出します。 。

2
Himansh