Body parserミドルウェア
リクエストデータは、start/kernel.ts
ファイル内で登録されたBodyParser
ミドルウェアを使用してパースされます。
ミドルウェアの設定は、config/bodyparser.ts
ファイルに格納されています。このファイルでは、JSONペイロード、ファイルアップロードを伴うマルチパートフォーム、URLエンコードされたフォームのパーサーを設定できます。
参照も: リクエストボディの読み取り
参照も: ファイルアップロード
import { defineConfig } from '@adonisjs/core/bodyparser'
export const defineConfig({
allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
form: {
// HTMLフォームのパース設定
},
json: {
// JSONボディのパース設定
},
multipart: {
// マルチパートパーサーの設定
},
raw: {
// 生のテキストパーサーの設定
},
})
許可されたメソッド
ボディパーサーミドルウェアがリクエストボディをパースしようとするメソッドの配列を定義できます。デフォルトでは、以下のメソッドが設定されています。ただし、メソッドを削除したり追加したりすることも自由です。
{
allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE']
}
空の文字列をnullに変換する
HTMLフォームでは、入力フィールドに値がない場合、リクエストボディに空の文字列が送信されます。このHTMLフォームの動作は、データの正規化をデータベースレイヤーで難しくします。
たとえば、country
という名前のデータベースカラムがnullableに設定されている場合、ユーザーが国を選択しない場合には、このカラムにnull
という値を格納したいと思うでしょう。
しかし、HTMLフォームでは、バックエンドは空の文字列を受け取り、カラムをnull
のままにせずに空の文字列をデータベースに挿入する可能性があります。
BodyParser
ミドルウェアは、この不整合を処理するために、設定内のconvertEmptyStringsToNull
フラグが有効になっている場合、すべての空の文字列値をnull
に変換できます。
{
form: {
// ...その他の設定
convertEmptyStringsToNull: true
},
json: {
// ...その他の設定
convertEmptyStringsToNull: true
},
multipart: {
// ...その他の設定
convertEmptyStringsToNull: true
}
}
JSONパーサー
JSONパーサーは、Content-type
ヘッダーが事前に定義されたtypes
のいずれかと一致するJSONエンコードされた文字列として定義されたリクエストボディをパースするために使用されます。
json: {
encoding: 'utf-8',
limit: '1mb',
strict: true,
types: [
'application/json',
'application/json-patch+json',
'application/vnd.api+json',
'application/csp-report',
],
convertEmptyStringsToNull: true,
}
-
encoding
-
リクエストボディのバッファを文字列に変換する際に使用するエンコーディングです。おそらく
utf-8
を使用したいと思うでしょう。ただし、iconv-liteパッケージでサポートされているエンコーディングを使用することもできます。 -
limit
-
パーサーが許可するリクエストボディデータの最大制限です。リクエストボディが設定された制限を超える場合、
413
エラーが返されます。 -
strict
-
厳密なパースは、JSONエンコードされた文字列のトップレベルでのみ
オブジェクト
と配列
を許可します。 -
types
-
Content-type
ヘッダーの値がJSONパーサーを使用してパースする必要がある場合の値の配列です。
URLエンコードされたフォームパーサー
form
パーサーは、Content-type
ヘッダーがapplication/x-www-form-urlencoded
に設定されたURLエンコードされた文字列をパースするために使用されます。つまり、HTMLフォームデータはform
パーサーを使用してパースされます。
form: {
encoding: 'utf-8',
limit: '1mb',
queryString: {},
types: ['application/x-www-form-urlencoded'],
convertEmptyStringsToNull: true,
}
-
encoding
-
リクエストボディのバッファを文字列に変換する際に使用するエンコーディングです。おそらく
utf-8
を使用したいと思うでしょう。ただし、iconv-liteパッケージでサポートされているエンコーディングを使用することもできます。 -
limit
-
マルチパートリクエストを処理する際に、フィールド(ファイルではない)の最大制限です。フィールドサイズが設定された制限を超える場合、
413
エラーが返されます。 -
queryString
-
URLエンコードされたリクエストボディは、qsパッケージを使用してパースされます。
queryString
プロパティを使用してパッケージのオプションを定義できます。form: {queryString: {allowDots: true,allowSparse: true,},}
マルチパートパーサー
multipart
パーサーは、ファイルアップロードを伴うHTMLフォームリクエストのパースに使用されます。
参照も: ファイルアップロード
multipart: {
autoProcess: true,
processManually: [],
encoding: 'utf-8',
fieldsLimit: '2mb',
limit: '20mb',
types: ['multipart/form-data'],
convertEmptyStringsToNull: true,
}
-
autoProcess
-
autoProcess
を有効にすると、すべてのユーザーがアップロードしたファイルがオペレーティングシステムのtmp
ディレクトリに移動されます。後でコントローラー内でファイルを検証し、永続的な場所やクラウドサービスに移動できます。
autoProcess
フラグを無効にすると、ストリームを手動で処理し、リクエストボディからファイル/フィールドを読み取る必要があります。参照も: 自己処理マルチパートストリーム。autoProcess
のファイルを自動処理するルートの配列を定義できます。値はルートパターンである必要があり、URLではありません。{autoProcess: ['/uploads','/post/:id']} -
processManually
-
processManually
配列を使用すると、選択したルートのファイルの自動処理をオフにできます。値はルートパターンである必要があり、URLではありません。multipart: {autoProcess: true,processManually: ['/file_manager','/projects/:id/assets'],} -
encoding
-
リクエストボディのバッファを文字列に変換する際に使用するエンコーディングです。おそらく
utf-8
を使用したいと思うでしょう。ただし、iconv-liteパッケージでサポートされているエンコーディングを使用することもできます。 -
limit
-
すべてのファイルを処理する際に許可されるバイト数の最大制限です。個々のファイルサイズ制限は、request.fileメソッドを使用して定義できます。
-
fieldsLimit
-
マルチパートリクエストを処理する際に、フィールド(ファイルではない)のバイト数の最大制限です。フィールドサイズが設定された制限を超える場合、
413
エラーが返されます。