ルーティング
Frourio では、Next.js のようなファイルシステムに基づいた API ルーティングを用いてコントローラーを定義します。 定義方法は、影響する範囲に基づいて大まかにコントローラーレベルとディレクトリレベルの 2 つに分類できます。
定義に用いるレベルはコントローラーの要素によって異なりますが、一部の要素では両方のレベルに定義することができます。 以下の表はこれをまとめたものです。
| 要素 | コントローラーレベル | ディレクトリレベル | 
|---|---|---|
| ハンドラー | 有効 | ❌ | 
| フック | 有効 | 有効 | 
| スキーマ | 有効 | ❌ | 
| バリデーター | 制限つき – bodyとheaders、queryのみ | 制限つき – paramsのみ | 
コントローラーレベル
要素がコントローラーレベルで定義された場合、現在のエンドポイントのみに影響します。
定義方法 : controller.ts 内で defineController() を用いる
注意
defineHooks() と defineResponseSchema() は frourio および frourio-express バージョン 0.31.0 以降で非推奨となりました。
controller.ts
import { defineController } from './$relay';
export default defineController(() => ({
  get: () => ({ status: 200, body: 'Hello' }),
  post: {
    validators: {
      query: z.object({ ... }),
      body: z.object({ ... }),
    },
    schemas: {
      response: { 201: { type: 'object', properties: { ... } } },
    },
    hooks: {
      preValidation: [],
      preHandler: (req, _, done) => { ...; done(); },
    },
    handler: ({ body }) => ({ status: 201, body: { ... } }),
  },
}));
関数 defineController()
引数の型
- Fastify
- Express
- function (fastify: FastifyInstance) => ServerMethods- FastifyInstance
- ServerMethods: key が- Methodsと等しく、value が- ServerMethodHandlerであるオブジェクト。
 
- function (app: Express) => ServerMethods- Express
- ServerMethods: key が- Methodsと等しく、value が- ServerMethodHandlerであるオブジェクト。
 
戻り値の型
- オブジェクト ServerMethods
オブジェクト ServerMethodHandler
{
  validators?: (コントローラーレベル バリデーター),
  schemas?: { response?: { [(HTTP Status Code)]: Schema } },
  hooks?: ServerHooks,
  handler: ServerHandler or ServerHandlerPromise,
}validators と schemas、hooks は省略できます。
handler のみを定義する場合、オブジェクトの代わりに ServerHandler または ServerHandlerPromise を直接渡すことができます。
ディレクトリレベル フック
要素がディレクトリレベルで定義された場合、現在のエンドポイントとその下にあるエンドポイント全てに影響します。
定義方法 : hooks.ts で defineHooks() を用いる
hooks.ts
import { defineHooks } from './$relay';
export default defineHooks(() => ({
  onRequest: (req, _, done) => {
    console.log(req.url);
    done();
  },
}));
関数 defineHooks()
- Fastify
- Express
ディレクトリレベル バリデーター
定義方法 : validators.ts で defineValidators() を用いる
validators.ts
import { defineValidators } from './$relay';
import { z } from 'zod';
export default defineValidators(() => ({
  params: z.object({ id: z.string() }),
}));
defineValidators() についての詳しい情報は、Zod ページを参照してください。