このページは英語の原文を翻訳したものです。内容に相違がある場合は英語版が優先されます。
検証
DaloyJS は Standard Schema を通じて入力を検証します。これは Zod、Valibot、ArkType などのバリデーターが公開している小さなインターフェースで、TypeBox も Standard Schema アダプター経由で使えます。プロジェクトに合ったバリデーターを選んでください。DaloyJS のコントラクトはどれを選んでも同じです。
検証の対象
ルートごとに、次のスキーマを宣言できます:
request.params:デコード済みのパスパラメーター。最初は文字列です。数値、UUID、列挙型が必要ならスキーマで変換してください。request.query:クエリ文字列の値。同じキーが繰り返されると、検証の前に配列になります。request.headers:小文字の名前で表したリクエストヘッダー。request.body:パース済みのリクエストボディ。ボディが読み込まれるのは、ルートがボディのスキーマを宣言している場合だけです。responses[status].body:型付けされ、検証されるレスポンスボディ。
クエリ文字列、フォームのフィールド、multipart のフィールドからは、検証の前に __proto__、constructor、prototype などのプロトタイプ汚染につながるキーが取り除かれます。
数値フィールドに範囲を設ける(金額、数量、ID)
素の z.number() は 1e308 や、変換のミスによる -Infinity など、IEEE の浮動小数点数としては問題なくても、金額、在庫、ページネーションにとっては致命的な値を受け入れてしまいます。リクエストの数値フィールドには、必ずドメインに合った範囲を設定してください:
Zod 4 は多くの場合 z.number() で NaN や有限でない数値をすでに拒否しますが、上限(.max())と符号の制約(.positive() / .nonnegative())は、返金詐欺やオーバーフローに対する最後の防波堤として引き続き必要です。レスポンスのスキーマと組み合わせて、機密性の高いフィールドが外部に漏れないようにしてください。
エンドツーエンドの例
バリデーターを選ぶ
- Zod(英語):多くのチームにとってのデフォルトです。チェーン可能な API、大きなエコシステムがあり、習得も簡単です。
- Valibot(英語):モジュール式でツリーシェイク可能です。エッジランタイムや、ブラウザに配布するコントラクトに最適です。
ArkType や TypeBox 互換のスキーマも、同じ ~standard プロパティを公開していれば動作します。ただし DaloyJS が公式のドキュメントとスキャフォールドを提供しているのは Zod と Valibot だけです。
並べて比較
スキーマが ~standard を公開していれば、どのバリデーターで作られたものでも、DaloyJS は同じようにハンドラーの型を推論し、OpenAPI を生成し、problem+json のエラーを返します。
エラー
- 信頼できない生のリクエストparams · query · headers · body
- standard schemaスキーマのパースvalidate(schema, input)
- 失敗時422 problem+jsonerrors: [{ path, message }]
- 成功時型付きハンドラーctx.body / params / query / headers
不正な入力に対して、DaloyJS は 422 Unprocessable Entity を RFC 9457 の problem+json として返します。その中には、問題ごとの path と message を持つ errors 配列が含まれます。このためのエラーハンドラーを書く必要はなく、最初から組み込まれています。エラーと problem+json をご覧ください。
レスポンスの検証
レスポンスのスキーマが宣言されている場合、DaloyJS はハンドラーの戻り値をシリアライズする前に検証します。実際に送信されるのは検証済みの値なので、未知のキーを取り除くオブジェクトスキーマは、宣言していないフィールドがクライアントに漏れることも防ぎます。検証に失敗した場合、本番環境ではクライアントに秘匿化された 500 の problem レスポンスが返ります。
ボディの上限とコンテンツタイプ
App の bodyLimitBytes オプション(デフォルト 1 MiB)は、宣言された Content-Length と、すべてのリクエストボディのストリーミング時のサイズを制限し、超えると 413 になります。1.5.4 以降はハンドラーが ctx.request から自分で読み込むボディも含め、すべてのルートに適用されます。上限はボディが読み込まれる時点で遅延的にチェックされます。
ルートが request.body を宣言している場合、DaloyJS は次の点も強制します:
- Content-Type をルートの
acceptsリスト(設定されていればグローバルのallowedContentTypes)と照合し、一致しなければ 415 になります。 - デフォルトで受け付けるボディの型:
application/json、application/x-www-form-urlencoded、multipart/form-data。 - JSON、クエリ文字列、urlencoded フォーム、multipart フォームのプロトタイプ汚染に強いパース。
JSON のボディはオブジェクトにパースされ、urlencoded のボディは URLSearchParams で、multipart のボディはプラットフォームの Request.formData() API でパースされます。ルートで独自のテキスト系メディアタイプを許可した場合、DaloyJS はデコード済みのテキストをボディのスキーマに渡します。
バリデーターを混在させる
ルートごとにバリデーターを自由に組み合わせられます。あるファイルでは Zod のスキーマ、別のファイルでは Valibot のスキーマを使っても問題ありません。既存のコードベースを移行するときや、共有パッケージのスキーマを利用するときに便利です。
最終更新: