body-parserはExpressで何をしますか?


337

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


54
HTTP POSTデータを読み取るには、「body-parser」ノードモジュールを使用する必要があります。body-parserは、フォームの入力を読み取り、アクセス可能なjavascriptオブジェクトとして格納する高速ミドルウェアの1つですreq.body
リファクタリング

2
このようなヘッダーとして、HTTPリクエスト内のすべてのデータを読み取ることができExpressで req.headers(配列)、あなたは、HTTPパケットのボディを読むことができるようreq.body@CleanCrispCodeによって説明し、クエリパラメータとして読み込むことができますreq.query.variableExpressが自動的にJavaScriptでの要求を変換するので、それは助けオブジェクト
フェルナンドザンペリン

3
@refactor-これはボディパーサーを使用しなければならない多くの理由の1つかもしれませんが、それが何をするかは言いません。つまり、HTTPリクエストとレスポンスオブジェクトはストリームであり、それらは単一のオブジェクトとして「読み取り可能」ではありません。ストリーム全体が最初にバッファリングされないように。res.bodyres.body
正義

1
Expressバージョン4.16以降では、独自のバージョンのbody-parserが組み込まれているので、このパッケージを取り込む必要はありません。
StefanBob

回答:


254

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

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

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

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

npm install body-parser --save

2019-april-2で編集: express@4.16.0で、expressにバンドルされているbody-parserミドルウェア。詳細はこちらをご覧ください


125
これはおそらくこれまでで最もラメなことです。Expressコア開発者が、Web開発の最も一般的なユースケースに追加のミドルウェアをインストールすることで、初心者が参加するのを非常に困難にするのはなぜですか?
elmt

5
@elmt意見がある場合は、sails.jsを試してください
ジョージ

1
@ user1063287はい、あります。urlencoded()そしてjson()、実際に呼び出すミドルウェア機能返しミドルウェアファクトリーですnext()
ニック・マニング

3
@elmtは不完全ではなく、ノードはWebだけでなく、デスクトップ、モバイルなどで使用でき、これらの場合は必須モジュールではありません。ノードは、いかなる責任を負うことなく、あなたのアプリケーションに適応することができます
fnaquira

27
@fnaquira-混乱しています。これはノードではなくエクスプレスについてです。
elmt 2007

84

はい、なくても作業できbody-parserます。使用しない場合は、未加工のリクエストが取得され、ボディとヘッダーがリクエストパラメータのルートオブジェクトにありません。すべてのフィールドを個別に操作する必要があります。

またはbody-parser、エクスプレスチームが保守しているため、使用できます。

body-parserができること:リクエストを簡素化します。
使用方法:例は次のとおりです。

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

このbody-parserをExpressで使用する方法:

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

そして、ルートリクエストオブジェクトのボディとヘッダーを取得できます。例

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
情報をありがとう、ボディパーサーなしでコード例を投稿できますか?
Ilyas karim

55

ここでの答えそれを非常に詳細かつ見事に説明しています、答えは以下を含みます:

要するに; body-parserは、受信したリクエストストリームの本文部分全体を抽出し、req.bodyインターフェースしやすいものとして公開します。それ自体は必要ありません。すべて自分で行うことができるからです。しかし、それはあなたが望むことをする可能性が最も高く、あなたのトラブルを救います。


もう少し詳しく説明します。body-parserは、受信したリクエストデータが圧縮されている場合はnodejs / zlibを使用して解凍し、stream-utils / raw-bodyが「解析」する前にリクエスト本文の完全な生のコンテンツを待機するミドルウェアを提供します(つまり、リクエストの本文を使用するつもりはなかったので、時間を無駄にしただけです)。

生のコンテンツを取得した後、body-parserは、使用することにした特定のミドルウェアに応じて、4つの戦略のいずれかを使用してコンテンツを解析します。

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

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

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

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

req.body目的のコンテンツに設定した後でのみ、スタック内の次のミドルウェアが呼び出されます。ミドルウェアは、解凍して解析する方法を考える必要なく、要求データにアクセスできます。

body-parser githubを参照してドキュメントを読むことができます。動作に関する情報が含まれています。


47

この最低限の技術を維持するようにしましょう。

たとえば、htmlフォームデータをnode-jsサーバーに送信している、つまりサーバーにリクエストを送信したとします。サーバーファイルは、リクエストオブジェクトの下でリクエストを受け取ります。ロジックによって、このリクエストオブジェクトをサーバーファイルにコンソールログすると、フォームデータがどこかにあり、そこから抽出できますが、おっと!あなたは実際にはしません!

では、データはどこにありますか?それが私のリクエストに存在するだけではない場合、それをどのように抽出しますか?

これに対する簡単な説明は、httpがフォームデータをビットとピースで送信することです。これらは宛先に到達したときに組み立てられることを目的としています。では、どのようにデータを抽出しますか?

ただし、データをチャンクごとに手動で解析してアセンブルするたびに、この面倒な作業を行う必要があるのはなぜですか。これを行う「body-parser」と呼ばれるものを使用してください。

body-parserはリクエストを解析し、必要な関連情報を簡単に抽出できる形式に変換します。

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

body-parserを使用する場合、リクエストからユーザー名とパスワードを抽出するのは以下のように簡単です。

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

したがって、基本的に、ボディパーサーは受信したリクエストを解析し、フォームデータを含むチャンクを組み立て、このボディオブジェクトを作成してフォームデータを入力します。


10

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

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


8

投稿データにアクセスするには、使用する必要がありますbody-parser。基本的にbody-parserは、表現が本文を読み取って、それを解析してJson理解できるオブジェクトに解析できるようにするものです。


7

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

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

これは、「最初にを使用する必要がありexpressますか?」繰り返しになりますが、答えはありません。実際、すべてのことは、「組み込み」で表現される基本的なことを行うために、より多くのコードを書く手間を省くことにかかっています。

表面的body-parserには、未加工のデータストリームをキャプチャして情報の形式を把握するのではなく、さまざまな形式でクライアント要求に含まれる情報にアクセスしやすくなり、その情報を使用可能なデータに手動で解析する手間が大幅に削減されます。


6

リクエストボディについて

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
});

ボディパーサーを理解する

そのドキュメントによると

ハンドラーの前にミドルウェアで受信リクエスト本文を解析します。req.bodyプロパティで利用できます。

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

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

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

req.body解析済みの本文に設定した後、body-parserはnext()スタックの下の次のミドルウェアを呼び出すために呼び出しを行い、次にそれを解凍して解析する方法を考える必要なく、要求データにアクセスできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.