ルーティング
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 ページを参照してください。