Zod
Frourio ではバリデーションに zod を使用します。Zod スキーマの定義方法については上のリンクからドキュメントを参照してください。
2 種類のバリデーター
Frourio は コントローラーレベル バリデーター と ディレクトリレベル バリデーター の 2 種類のバリデーターを提供しています。 それぞれで検証可能な要素が異なります。
- コントローラーレベル バリデーター: 現在の階層でのみ呼ばれます。paramsは検証できません。- query
- headers
- body
 
- ディレクトリレベル バリデーター: 現在と 配下の 階層で呼ばれます。paramsのみ検証できます。- params
 
コントローラーレベル
defineController() についてはルーティングページを参照してください。
{
  [(target key)]?: z.object({ ... })
}
validators は key が RequestParams (query や headers、body) に等しく、value が Zod オブジェクトスキーマ (z.object()) であるオブジェクトです。
それぞれのスキーマは z.ZodType を用いて API 型定義との一貫性が確認されます。
import { DefineMethods } from 'aspida';
import { Fuga, Res } from '$/types';
export type Methods = DefineMethods<{
  get: {
    resBody: string;
  };
  post: {
    reqBody: {
      hogeString: string;
      fugaObject: Fuga;
      piyoBoolean?: boolean;
    };
    query: {
      length?: number;
    };
    resBody: Res;
  };
}>;
import { defineController } from './$relay';
import { z } from 'zod';
export default defineController(() => ({
  get: () => ({ status: 200, body: 'Hello' }),
  post: {
    validators: {
      query: z.object({
        length: z.number().optional(),
      }),
      body: z.object({
        hogeString: z.string(),
        fugaObject: z.object({ ... }),
        piyoBoolean: z.boolean().optional(),
      }),
    },
    handler: async ({ params: { id }, body, query: { length } }) => {
      const res = await createBaz(id, body, length);
      if (!res) return { status: 400 };
      return { status: 201, body: res };
    },
  },
}));
ディレクトリレベル
ディレクトリレベルバリデーターを定義するには、対象のディレクトリの最上層に validators.ts を作成し、./$relay.ts でエクスポートされた defineValidators を使用します。
エンドポイントに影響する複数のディレクトリレベルバリデーターがある場合、.and を用いて交差型に変換されます。
名前にパスパラメータを持つディレクトリが作成された際、Frourio は自動的に validators.ts を作成します。
import { defineValidators } from './$relay';
import { z } from 'zod';
export default defineValidators(() => ({
  params: z.object({ id: z.string() }),
}));
関数 defineValidators
- Fastify
- Express
引数の型
- function (fastify: FastifyInstance) => { params: (zod object schema) }
(zod object schema) の実際の定義は z.ZodType<{ (params type) }> ですが、これを意識する必要はありません。
これによって API 型定義との一貫性が確保されているのです。
{ (params type) }そのディレクトリが持つパスパラメータの型定義。
上位のディレクトリのものは含まれません。
無指定の場合は string になりますが、自動バリデーションのページにもあるように、指定することを推奨します。
引数の型
- function (app: Express) => { params: (zod object schema) }
(zod object schema) の実際の定義は z.ZodType<{ (params type) }> ですが、これを意識する必要はありません。
これによって API 型定義との一貫性が確保されているのです。
{ (params type) }そのディレクトリが持つパスパラメータの型定義。
上位のディレクトリのものは含まれません。
無指定の場合は string になりますが、自動バリデーションのページにもあるように、指定することを推奨します。