メインコンテンツまでスキップ

ルーティング

Frourio では、Next.js のようなファイルシステムに基づいた API ルーティングを用いてコントローラーを定義します。 定義方法は、影響する範囲に基づいて大まかにコントローラーレベルとディレクトリレベルの 2 つに分類できます。

定義に用いるレベルはコントローラーの要素によって異なりますが、一部の要素では両方のレベルに定義することができます。 以下の表はこれをまとめたものです。

要素コントローラーレベルディレクトリレベル
ハンドラー有効
フック有効有効
スキーマ有効
バリデーター制限つき bodyheadersquery のみ制限つき 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()

引数の型

  • function (fastify: FastifyInstance) => ServerMethods

戻り値の型

  • オブジェクト ServerMethods

オブジェクト ServerMethodHandler

{
  validators?: (コントローラーレベル バリデーター),
  schemas?: { response?: { [(HTTP Status Code)]: Schema } },
  hooks?: ServerHooks,
  handler: ServerHandler or ServerHandlerPromise,
}

validatorsschemashooks は省略できます。 handler のみを定義する場合、オブジェクトの代わりに ServerHandler または ServerHandlerPromise を直接渡すことができます。

ディレクトリレベル フック

要素がディレクトリレベルで定義された場合、現在のエンドポイントとその下にあるエンドポイント全てに影響します。

定義方法 : hooks.tsdefineHooks() を用いる

hooks.ts
import { defineHooks } from './$relay';

export default defineHooks(() => ({
onRequest: (req, _, done) => {
console.log(req.url);
done();
},
}));

関数 defineHooks()

引数の型
  • function (fastify: FastifyInstance) => ServerHooks
    • Hooks : フックの名前を key とし、ハンドラ関数(またはその配列)を value とするオブジェクト
戻り値の型
  • ServerHooks オブジェクト

ディレクトリレベル バリデーター

定義方法 : validators.tsdefineValidators() を用いる

validators.ts
import { defineValidators } from './$relay';
import { z } from 'zod';

export default defineValidators(() => ({
params: z.object({ id: z.string() }),
}));

defineValidators() についての詳しい情報は、Zod ページを参照してください。