Node.js のボディ解析ミドルウェア。
ハンドラーの前にミドルウェアで受信リクエストボディを解析し、req.body
プロパティで利用可能にします。
注記 req.body
の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できず、信頼する前に検証する必要があります。たとえば、req.body.foo.toString()
は、foo
プロパティが存在しない場合や文字列でない場合、toString
が関数ではなく文字列またはその他のユーザー入力であるなど、さまざまな方法で失敗する可能性があります。
Node.js での HTTP トランザクションの構造について学習します。.
これはマルチパートボディを処理しません。これは、その複雑さと通常は大きな性質によるものです。マルチパートボディの場合、次のモジュールに興味があるかもしれません。
このモジュールは次のパーサーを提供します。
その他興味のあるボディパーサー
$ npm install body-parser
var bodyParser = require('body-parser')
bodyParser
オブジェクトは、ミドルウェアを作成するためのさまざまなファクトリを公開します。すべてのミドルウェアは、Content-Type
リクエストヘッダーがtype
オプションと一致する場合、解析されたボディを含むreq.body
プロパティを設定します。解析するボディがない場合、Content-Type
が一致しない場合、またはエラーが発生した場合は、空のオブジェクト({}
)を設定します。
このモジュールによって返されるさまざまなエラーについては、エラーセクションに記載されています。
json
を解析するだけで、Content-Type
ヘッダーが type
オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーはボディの任意の Unicode エンコーディングを受け入れ、gzip
と deflate
エンコーディングの自動インフレーションをサポートします。
ミドルウェアの後、解析されたデータを含む新しい body
オブジェクトが request
オブジェクトに設定されます(つまり、req.body
)。
json
関数は、次のキーのいずれかを含むオプションの options
オブジェクトを受け入れます。
true
に設定すると、圧縮されたボディが展開されます。false
の場合、圧縮されたボディは拒否されます。デフォルトは true
です。
最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb'
です。
reviver
オプションは、2 番目の引数として JSON.parse
に直接渡されます。この引数に関する詳細については、JSON.parse に関する MDN ドキュメント を参照してください。
true
に設定すると、配列とオブジェクトのみを受け入れます。false
の場合、JSON.parse
が受け入れるものは何でも受け入れます。デフォルトは true
です。
type
オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type
オプションは fn(req)
として呼び出され、真の値を返す場合にリクエストが解析されます。デフォルトは application/json
です。関数の場合は、type
オプションは fn(req)
として呼び出され、リクエストは真の値を返す場合に解析されます。デフォルトは application/json
です。
verify
オプションが指定されている場合、verify(req, res, buf, encoding)
として呼び出されます。ここで、buf
は生のリクエストボディの Buffer
であり、encoding
はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。
すべてのボディを Buffer
として解析し、Content-Type
ヘッダーが type
オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーは、gzip
と deflate
エンコーディングの自動インフレーションをサポートします。
ミドルウェアの後、解析されたデータを含む新しい body
オブジェクトが request
オブジェクトに設定されます(つまり、req.body
)。これはボディの Buffer
オブジェクトになります。
raw
関数は、次のキーを含むオプションの options
オブジェクトを受け入れます。
true
に設定すると、圧縮されたボディが展開されます。false
の場合、圧縮されたボディは拒否されます。デフォルトは true
です。
最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb'
です。
type
オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type
オプションは fn(req)
として呼び出され、真の値を返す場合にリクエストが解析されます。デフォルトは application/octet-stream
です。
verify
オプションが指定されている場合、verify(req, res, buf, encoding)
として呼び出されます。ここで、buf
は生のリクエストボディの Buffer
であり、encoding
はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。
すべてのボディを文字列として解析し、Content-Type
ヘッダーが type
オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーは、gzip
と deflate
エンコーディングの自動インフレーションをサポートします。
ミドルウェアの後、解析されたデータを含む新しい body
文字列が request
オブジェクトに設定されます(つまり、req.body
)。これはボディの文字列になります。
text
関数は、次のキーを含むオプションの options
オブジェクトを受け入れます。
リクエストの Content-Type
ヘッダーに文字セットが指定されていない場合、テキストコンテンツのデフォルト文字セットを指定します。デフォルトは utf-8
です。
true
に設定すると、圧縮されたボディが展開されます。false
の場合、圧縮されたボディは拒否されます。デフォルトは true
です。
最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb'
です。
type
オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type
オプションは fn(req)
として呼び出され、真の値を返す場合にリクエストが解析されます。デフォルトは text/plain
です。
verify
オプションが指定されている場合、verify(req, res, buf, encoding)
として呼び出されます。ここで、buf
は生のリクエストボディの Buffer
であり、encoding
はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。
urlencoded
ボディのみを解析し、Content-Type
ヘッダーが type
オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーは、ボディの UTF-8 エンコーディングのみを受け入れ、gzip
と deflate
エンコーディングの自動インフレーションをサポートします。
ミドルウェアの後、解析されたデータを含む新しい body
オブジェクトが request
オブジェクトに設定されます(つまり、req.body
)。このオブジェクトには、キーと値のペアが含まれ、値は文字列または配列(extended
が false
の場合)、または任意のタイプ(extended
が true
の場合)になります。
urlencoded
関数は、次のキーを含むオプションの options
オブジェクトを受け入れます。
extended
オプションを使用すると、querystring
ライブラリ(false
の場合)または qs
ライブラリ(true
の場合)を使用して URL エンコードされたデータを解析するかを選択できます。「拡張」構文により、リッチオブジェクトと配列を URL エンコード形式にエンコードできるため、URL エンコードで JSON のようなエクスペリエンスが得られます。詳細については、qs ライブラリを参照してください。
デフォルトは true
ですが、デフォルトの使用は非推奨になっています。qs
と querystring
の違いを調査し、適切な設定を選択してください。
true
に設定すると、圧縮されたボディが展開されます。false
の場合、圧縮されたボディは拒否されます。デフォルトは true
です。
最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb'
です。
parameterLimit
オプションは、URL エンコードされたデータで許可されるパラメーターの最大数を制御します。リクエストがこの値より多くのパラメーターを含む場合、クライアントに 413 が返されます。デフォルトは 1000
です。
type
オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type
オプションはtype-isライブラリに直接渡され、拡張子名(urlencoded
など)、MIMEタイプ(application/x-www-form-urlencoded
など)、またはワイルドカード付きのMIMEタイプ(*/x-www-form-urlencoded
など)を指定できます。関数の場合は、type
オプションはfn(req)
として呼び出され、真の値を返した場合にリクエストが解析されます。デフォルトはapplication/x-www-form-urlencoded
です。
verify
オプションが指定されている場合、verify(req, res, buf, encoding)
として呼び出されます。ここで、buf
は生のリクエストボディの Buffer
であり、encoding
はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。
このモジュールによって提供されるミドルウェアは、http-errors
モジュールを使用してエラーを作成します。エラーは通常、推奨されるHTTPレスポンスコードを含むstatus
/statusCode
プロパティ、message
プロパティをクライアントに表示するかどうかを決定するexpose
プロパティ、message
と照合せずにエラーの種類を決定するtype
プロパティ、および使用可能な場合に読み取られた本文を含むbody
プロパティを持ちます。
以下は、一般的に発生するエラーです。ただし、さまざまな理由で任意のエラーが発生する可能性があります。
このエラーは、リクエストにエンコーディングが含まれるContent-Encoding
ヘッダーが含まれており、「inflation」オプションがfalse
に設定されている場合に発生します。status
プロパティは415
に設定され、type
プロパティは'encoding.unsupported'
に設定され、charset
プロパティはサポートされていないエンコーディングに設定されます。
このエラーは、リクエストにミドルウェアによって解析できなかったエンティティが含まれている場合に発生します。status
プロパティは400
に設定され、type
プロパティは'entity.parse.failed'
に設定され、body
プロパティは解析に失敗したエンティティ値に設定されます。
このエラーは、リクエストに定義されたverify
オプションによる検証に失敗したエンティティが含まれている場合に発生します。status
プロパティは403
に設定され、type
プロパティは'entity.verify.failed'
に設定され、body
プロパティは検証に失敗したエンティティ値に設定されます。
このエラーは、本文の読み取りが完了する前にクライアントによってリクエストが中断された場合に発生します。received
プロパティは、リクエストが中断される前に受信したバイト数に設定され、expected
プロパティは予想されるバイト数に設定されます。status
プロパティは400
に設定され、type
プロパティは'request.aborted'
に設定されます。
このエラーは、リクエスト本文のサイズが「limit」オプションより大きい場合に発生します。limit
プロパティはバイト制限に設定され、length
プロパティはリクエスト本文の長さに設定されます。status
プロパティは413
に設定され、type
プロパティは'entity.too.large'
に設定されます。
このエラーは、リクエストの長さがContent-Length
ヘッダーからの長さとは一致しない場合に発生します。これは通常、リクエストが不正な形式である場合(通常、Content-Length
ヘッダーがバイトではなく文字に基づいて計算された場合)に発生します。status
プロパティは400
に設定され、type
プロパティは'request.size.invalid'
に設定されます。
このエラーは、このミドルウェアの前に何かがreq.setEncoding
メソッドを呼び出した場合に発生します。このモジュールはバイトのみを直接操作し、このモジュールを使用する場合はreq.setEncoding
を呼び出すことはできません。status
プロパティは500
に設定され、type
プロパティは'stream.encoding.set'
に設定されます。
このエラーは、このミドルウェアが読み取ろうとしたときにリクエストがもはや読み取り可能ではない場合に発生します。これは通常、このモジュール以外のミドルウェアが既にリクエスト本文を読み取り、ミドルウェアも同リクエストの読み取りが設定されていることを意味します。status
プロパティは500
に設定され、type
プロパティは'stream.not.readable'
に設定されます。
このエラーは、リクエストのコンテンツがurlencoded
パーサーの構成されたparameterLimit
を超えた場合に発生します。status
プロパティは413
に設定され、type
プロパティは'parameters.too.many'
に設定されます。
このエラーは、リクエストにContent-Type
ヘッダーに文字セットパラメータが含まれているが、iconv-lite
モジュールがそれをサポートしていないか、またはパーサーがそれをサポートしていない場合に発生します。文字セットはメッセージとcharset
プロパティの両方に含まれています。status
プロパティは415
に設定され、type
プロパティは'charset.unsupported'
に設定され、charset
プロパティはサポートされていない文字セットに設定されます。
このエラーは、リクエストにサポートされていないエンコーディングが含まれるContent-Encoding
ヘッダーが含まれている場合に発生します。エンコーディングはメッセージとencoding
プロパティの両方に含まれています。status
プロパティは415
に設定され、type
プロパティは'encoding.unsupported'
に設定され、encoding
プロパティはサポートされていないエンコーディングに設定されます。
この例は、すべての受信リクエストの本文を解析するトップレベルミドルウェアとして、汎用JSONおよびURLエンコードパーサーを追加する方法を示しています。これは最も簡単な設定です。
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.use(function (req, res) {
res.setHeader('Content-Type', 'text/plain')
res.write('you posted:\n')
res.end(JSON.stringify(req.body, null, 2))
})
この例は、必要なルートにボディパーサーを具体的に追加する方法を示しています。一般的に、これはExpressでbody-parserを使用する最も推奨される方法です。
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// create application/json parser
var jsonParser = bodyParser.json()
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
res.send('welcome, ' + req.body.username)
})
// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
// create user in req.body
})
すべてのパーサーは、ミドルウェアが解析するContent-Type
を変更できるtype
オプションを受け入れます。
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse various different custom JSON types as JSON
app.use(bodyParser.json({ type: 'application/*+json' }))
// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }))