body-parser
を使わなくてもデータを取得できるため、Expressアプリケーションでbody-parser
が必要な理由はわかりません。そしてそれは実際には何をしているのでしょうか?
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にバンドルされています。 詳細はこれを見てください
はい、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 }));
リンク。
答え ここ それを非常に詳細にそして華麗に説明しなさい、答えは含まれています:
要するに; body-parser は入ってくるリクエストストリームのボディ部分全体を抽出し、それをより簡単なインターフェースとして
req.body
に公開します。あなたはそれを必要としません、あなたがそれのすべてをあなた自身ですることができるので。しかし、それはたぶんあなたが望むことをし、あなたに悩みを救うでしょう。もう少し詳しく説明します。 body-parserは nodejs/zlib を使用して着信要求データをzip形式で解凍し、 stream-utils/raw-body を使用して要求本体の生の内容全体を待つミドルウェアを提供します。それをパースする "(これはあなたがリクエストボディを使用しないのであれば、あなたはしばらく時間を無駄にしたことを意味する。).
生のコンテンツを入手した後、body-parserは使用することに決めた特定のミドルウェアに応じて、4つの戦略のうちの1つを使用してそれを解析します。
bodyParser.raw() :実際に本文を解析するのではなく、バッファリングされたコンテンツを前の Buffer に
req.body
で公開するだけです。bodyParser.text() :バッファをプレーンテキストとして読み込み、結果の文字列をreq.bodyに公開します。
bodyParser.urlencoded() :テキストをURLエンコードデータとして解析し(これにより、ブラウザは通常のフォームからPOSTに設定されたフォームデータを送信する傾向があります)、結果のオブジェクト(キーと値を含む)を
req.body
に公開します。比較のために。 PHPでは、これらすべてが自動的に行われ、$_POST
に公開されます。bodyParser.json() :テキストをJSONとして解析し、結果のオブジェクトを
req.body
に公開します。
req.body
を望ましい内容に設定した後に初めて、スタック内の次のミドルウェアを呼び出します。これにより、解凍して解析する方法を考えなくても要求データにアクセスできます。
あなたはそれらのドキュメントを読むために body-parser github を参照することができます、それはその動作に関する情報を含んでいます。
これを技術的でないものにしてみましょう。
たとえば、あなたがHTML形式のデータをnode-jsサーバーに送信しているとします。つまり、サーバーにリクエストを送信したとします。サーバーファイルはリクエストオブジェクトの下にリクエストを受け取ります。論理的に言うと、コンソールでこのリクエストオブジェクトをサーバーファイルに記録すると、フォームデータのどこかにフォームデータが表示されるはずです。あなたは実際にそうではありません!
それで、我々のデータはどこにありますか?リクエストに含まれていない場合、どのように抽出しますか。
これに対する簡単な説明は、httpがあなたのフォームデータをそれらが目的地に到着するときに組み立てられるように意図されたビットと小片で送るということです。だからあなたはどのようにあなたのデータを抽出するのだろうか。
しかし、毎回手作業でデータのチャンクを解析してそれを組み立てるというこのような苦労をする必要はありません。あなたのためにこれをするだろう「ボディパーサー」と呼ばれるものを使用してください。
body-parserはあなたのリクエストを解析し、それをあなたが必要とするかもしれない関連情報を簡単に抽出できるフォーマットに変換します。
たとえば、フロントエンドにサインアップフォームがあるとしましょう。あなたはそれを記入していて、どこかに詳細を保存するようにサーバーに要求しています。
あなたの要求からユーザー名とパスワードを抽出することはあなたがbody-parserを使うならば以下のように簡単になります。
var loginDetails = {
username : request.body.username,
password : request.body.password
};
つまり基本的に、body-parserはあなたの入ってきたリクエストを解析し、あなたのフォームデータを含むチャンクを組み立て、それからあなたのためにこのbodyオブジェクトを作成し、そしてあなたのフォームデータでそれを埋めました。
HTTPリクエストボディを解析します。これは通常、ヒットしたURLだけでなく、必要な情報が本文に含まれているPOSTまたはPUT PATCH HTTP要求のコンテキストで知る必要がある場合に必要です。
基本的にはJSON、プレーンテキストを解析するための、または必要に応じて処理するための生のBufferオブジェクトを返すためのミドルウェアです。
これらはすべて便利な問題です。
基本的に、もし質問が「body-parser
を使うために、私たちは を必要としますか でしたか?」であれば。答えはノーだ'。一般的に柔軟性が低く、同じ情報を取得するために記述しなければならないコードの量が増える、より遠回りのないルートを使用してclient-post-requestから同じ情報を思いつくことができます。
これは、「最初にexpress
を使用するには need を使用しますか?」と質問するのと同じです。繰り返しますが、答えはありません。また、expressの基本的な機能を実行するためにコードを追加する手間を省くことができます。
表面上 - body-parser
を使用すると、生のデータストリームをキャプチャして情報の形式を把握するのではなく、クライアントの要求に含まれる情報をさまざまな形式で簡単に取得できます。 。
投稿データにアクセスするには、body-parser
を使用する必要があります。基本的にexpressが本体を読み、それを解析して理解できるJson
オブジェクトにすることを可能にするbody-parser
とは何ですか。
リクエストボディを理解する
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()
を呼び出してスタックの次のミドルウェアを呼び出します。 。