Zodを使用すると、FastifyでZodを使用できる。サンプルのプロジェクトを作成したので、実際の動作はそちらを参照。https://github.com/sato-dev1234/fastify-drizzle-example実装の際に気を付けたことや詰まった点について記載する。バリデーションスキーマの渡し方Fastifyでバリデーションを行う場合は、値の渡し方によって実装が異なる。handler)また、型情報も渡せるのでバリデーションスキーマに併せて実装しておくと良い。}>参考:https://fastify.dev/docs/latest/Reference/Validation-and-Serialization/#validationクエリパラメータはstring型idはnumber型を想定しているが、クエリパラメータで渡す場合にはstring型で渡されるので注意すること。"数値での入力を期待していますが、文字列が入力されました。z.number(),};文字列の長さのチェック1文字以上でない場合、必須エラーを発生させる。parseIntでnumber型に変換する数値じゃない場合は、エラーを発生させる。スキーマと型の宣言z.objectバリデーションスキーマはオブジェクト型で渡すため、z.objectを使用する。z.string().max(256).min(1),};z.inferバリデーションスキーマのTypescriptの型情報をわたす場合はz.inferを使用すること。NULLのチェックが行われる。値なしには、nullが設定されるケースと値自体が設定されない2パターンが考えられるが、値の扱い方は統一したい場合がある。以下の場合はどちらのケースの場合もnullを設定するようにする。nullableString(z.string().email())});nullish:nullとundefinedどちらも許容する。ライブラリを使用したバリデーションバリデーションにライブラリを使用したい場合がある。以下はlibphonenumber-jsで日本で使用できる電話番号かをチェックしている。"利用できない電話番号が入力されました。japanPhoneNumberType});エラーメッセージの日本語化zod-i18nで日本語化できる。仕組みとしては、i18nextに対してzod-i18nが用意したJSONファイルを読み込ませているのみである。プロジェクト内でzod-i18nのJSONファイルを参考にプロジェクト内にjsonファイルを用意して読み込ませれば良い。},});z.setErrorMap(zodI18nMap);ZodErrorの内容がJSON文字列で格納されてしまうzodが出力したバリデーションエラーをそのまま返すとエラー内容がJSON文字列で返されてしまい、扱いづらい。以下は、配列で渡された連絡先情報(電話番号・メールアドレス)を登録しようとしたケースである。1件目は電話番号が未入力のためエラー、2件目はメールアドレスが不正な値のためエラーとなっている。\"メールアドレスの形式で入力してください。}\n]"}上記の問題を解決するためにfastify-errorを使用してカスタムエラーを作成する。base.error.ts:エラーの基底クラス。validation.error.ts:バリデーションエラーのクラス。ZodIssueを追加する。}}fastify-errorのcreateErrorを参考に実装。Zodによると、Zodで発生したエラーの詳細はZodIssueに記載される。ZodError.tsを見ると、ZodIssueの基底クラスがZodIssueBaseなので、ZodIssueBaseを定義する。ZodIssueのうちpathがエラーの発生箇所、messageがエラーメッセージが格納されており、基底クラスの情報のみでエラーの特定ができるという判断で扱う情報を基底クラスのZodIssueBaseのみに絞っている。setErrorHandlerを使用すると、エラーハンドリングをカスタマイズできるので、ZodErrorだった場合はカスタムエラーを返すようにする。});};カスタマイズ後のエラーは以下のようになる。"メールアドレスの形式で入力してください。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。