Body パーサー

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エラーが返されます。