body-parser

NPM Version NPM Downloads Build Status Test Coverage

Node.js のボディ解析ミドルウェア。

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

注記 req.body の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できず、信頼する前に検証する必要があります。たとえば、req.body.foo.toString() は、foo プロパティが存在しない場合や文字列でない場合、toString が関数ではなく文字列またはその他のユーザー入力であるなど、さまざまな方法で失敗する可能性があります。

Node.js での HTTP トランザクションの構造について学習します。.

これはマルチパートボディを処理しません。これは、その複雑さと通常は大きな性質によるものです。マルチパートボディの場合、次のモジュールに興味があるかもしれません。

このモジュールは次のパーサーを提供します。

その他興味のあるボディパーサー

インストール

$ npm install body-parser

API

var bodyParser = require('body-parser')

bodyParser オブジェクトは、ミドルウェアを作成するためのさまざまなファクトリを公開します。すべてのミドルウェアは、Content-Type リクエストヘッダーがtype オプションと一致する場合、解析されたボディを含むreq.body プロパティを設定します。解析するボディがない場合、Content-Type が一致しない場合、またはエラーが発生した場合は、空のオブジェクト({})を設定します。

このモジュールによって返されるさまざまなエラーについては、エラーセクションに記載されています。

bodyParser.json([options])

json を解析するだけで、Content-Type ヘッダーが type オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーはボディの任意の Unicode エンコーディングを受け入れ、gzipdeflate エンコーディングの自動インフレーションをサポートします。

ミドルウェアの後、解析されたデータを含む新しい body オブジェクトが request オブジェクトに設定されます(つまり、req.body)。

オプション

json 関数は、次のキーのいずれかを含むオプションの options オブジェクトを受け入れます。

inflate

true に設定すると、圧縮されたボディが展開されます。false の場合、圧縮されたボディは拒否されます。デフォルトは true です。

limit

最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb' です。

reviver

reviver オプションは、2 番目の引数として JSON.parse に直接渡されます。この引数に関する詳細については、JSON.parse に関する MDN ドキュメント を参照してください。

strict

true に設定すると、配列とオブジェクトのみを受け入れます。false の場合、JSON.parse が受け入れるものは何でも受け入れます。デフォルトは true です。

type

type オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type オプションは fn(req) として呼び出され、真の値を返す場合にリクエストが解析されます。デフォルトは application/json です。関数の場合は、type オプションは fn(req) として呼び出され、リクエストは真の値を返す場合に解析されます。デフォルトは application/json です。

verify

verify オプションが指定されている場合、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。

bodyParser.raw([options])

すべてのボディを Buffer として解析し、Content-Type ヘッダーが type オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーは、gzipdeflate エンコーディングの自動インフレーションをサポートします。

ミドルウェアの後、解析されたデータを含む新しい body オブジェクトが request オブジェクトに設定されます(つまり、req.body)。これはボディの Buffer オブジェクトになります。

オプション

raw 関数は、次のキーを含むオプションの options オブジェクトを受け入れます。

inflate

true に設定すると、圧縮されたボディが展開されます。false の場合、圧縮されたボディは拒否されます。デフォルトは true です。

limit

最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb' です。

type

type オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type オプションは fn(req) として呼び出され、真の値を返す場合にリクエストが解析されます。デフォルトは application/octet-stream です。

verify

verify オプションが指定されている場合、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。

bodyParser.text([options])

すべてのボディを文字列として解析し、Content-Type ヘッダーが type オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーは、gzipdeflate エンコーディングの自動インフレーションをサポートします。

ミドルウェアの後、解析されたデータを含む新しい body 文字列が request オブジェクトに設定されます(つまり、req.body)。これはボディの文字列になります。

オプション

text 関数は、次のキーを含むオプションの options オブジェクトを受け入れます。

defaultCharset

リクエストの Content-Type ヘッダーに文字セットが指定されていない場合、テキストコンテンツのデフォルト文字セットを指定します。デフォルトは utf-8 です。

inflate

true に設定すると、圧縮されたボディが展開されます。false の場合、圧縮されたボディは拒否されます。デフォルトは true です。

limit

最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb' です。

type

type オプションは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数にすることができます。関数の場合は、type オプションは fn(req) として呼び出され、真の値を返す場合にリクエストが解析されます。デフォルトは text/plain です。

verify

verify オプションが指定されている場合、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすることで、解析を中止できます。

bodyParser.urlencoded([options])

urlencoded ボディのみを解析し、Content-Type ヘッダーが type オプションと一致するリクエストのみを調べるミドルウェアを返します。このパーサーは、ボディの UTF-8 エンコーディングのみを受け入れ、gzipdeflate エンコーディングの自動インフレーションをサポートします。

ミドルウェアの後、解析されたデータを含む新しい body オブジェクトが request オブジェクトに設定されます(つまり、req.body)。このオブジェクトには、キーと値のペアが含まれ、値は文字列または配列(extendedfalse の場合)、または任意のタイプ(extendedtrue の場合)になります。

オプション

urlencoded 関数は、次のキーを含むオプションの options オブジェクトを受け入れます。

extended

extended オプションを使用すると、querystring ライブラリ(false の場合)または qs ライブラリ(true の場合)を使用して URL エンコードされたデータを解析するかを選択できます。「拡張」構文により、リッチオブジェクトと配列を URL エンコード形式にエンコードできるため、URL エンコードで JSON のようなエクスペリエンスが得られます。詳細については、qs ライブラリを参照してください

デフォルトは true ですが、デフォルトの使用は非推奨になっています。qsquerystring の違いを調査し、適切な設定を選択してください。

inflate

true に設定すると、圧縮されたボディが展開されます。false の場合、圧縮されたボディは拒否されます。デフォルトは true です。

limit

最大リクエストボディサイズを制御します。数値の場合、値はバイト数を指定します。文字列の場合、値は bytes ライブラリに渡されて解析されます。デフォルトは '100kb' です。

parameterLimit

parameterLimit オプションは、URL エンコードされたデータで許可されるパラメーターの最大数を制御します。リクエストがこの値より多くのパラメーターを含む場合、クライアントに 413 が返されます。デフォルトは 1000 です。

type

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 オプションが指定されている場合、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'に設定されます。

サポートされていない文字セット「BOGUS」

このエラーは、リクエストにContent-Typeヘッダーに文字セットパラメータが含まれているが、iconv-liteモジュールがそれをサポートしていないか、またはパーサーがそれをサポートしていない場合に発生します。文字セットはメッセージとcharsetプロパティの両方に含まれています。statusプロパティは415に設定され、typeプロパティは'charset.unsupported'に設定され、charsetプロパティはサポートされていない文字セットに設定されます。

サポートされていないコンテンツエンコーディング「bogus」

このエラーは、リクエストにサポートされていないエンコーディングが含まれるContent-Encodingヘッダーが含まれている場合に発生します。エンコーディングはメッセージとencodingプロパティの両方に含まれています。statusプロパティは415に設定され、typeプロパティは'encoding.unsupported'に設定され、encodingプロパティはサポートされていないエンコーディングに設定されます。

Express/Connect トップレベル汎用

この例は、すべての受信リクエストの本文を解析するトップレベルミドルウェアとして、汎用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 ルート固有

この例は、必要なルートにボディパーサーを具体的に追加する方法を示しています。一般的に、これは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' }))

ライセンス

MIT