自動バリデーション
Frourio は、パスパラメータ、URL クエリ、リクエストボディに対していくつかの自動変換と軽微なバリデーションを行います。
パスパラメータ
パスパラメータに @string
または @number
を付けることで型を定義することができ、frourio におけるデフォルトは string
です。
型が number
として定義されている場合、frourio は自動的に string から number に変換しそれが NaN でないことを検証します。
注意
型が定義されていない場合、frourio と aspida の振る舞いには 大きな違いがあります。
上にあるように frourio は string
として解釈しますが、aspida は string | number
として解釈します。
これはパスパラメータが URL を通じて渡されることによる情報の損失に起因します。
特殊な事情がない限り、型を明示するべきです。
例
API 型定義
server/api/tasks/_taskId@number/index.ts
import { Task } from '$/types';
export type Methods = {
get: {
resBody: Task;
};
};
コントローラー
server/api/tasks/_taskId@number/controller.ts
import { defineController } from './$relay';
import { findTask } from '$/service/tasks';
export default defineController(() => ({
get: async ({ params }) => {
const task = await findTask(params.taskId);
return task ? { status: 200, body: task } : { status: 404 };
},
}));
結果
$ curl http://localhost:8080/api/tasks
[{"id":0,"label":"sample task","done":false}]
$ curl http://localhost:8080/api/tasks/0
{"id":0,"label":"sample task","done":false}
$ curl http://localhost:8080/api/tasks/1 -i
HTTP/1.1 404 Not Found
$ curl http://localhost:8080/api/tasks/abc -i
HTTP/1.1 400 Bad Request
URL クエリ
URL クエリが次のように定義されていると…
- required
- Frourio は自動的にそれが存在するか検証します。
- それが存在せず、かつ配列として定義されている場合は、frourio が空の配列
[]
をセットします。
number
- Frourio は自動的に string から number に変換しそれが NaN でないことを検証します。
boolean
- Frourio は自動的に string (
'true'
または'false'
) から boolean に変換します。
- Frourio は自動的に string (
また key が角括弧で終わる場合は (例: foo[]
)、frourio は自動的に角括弧を除去します (例:
foo
)。
例
API 型定義
server/api/tasks/index.ts
import { Task } from '$/types';
export type Methods = {
get: {
query?: {
limit: number;
};
resBody: Task[];
};
};
コントローラー
server/api/tasks/controller.ts
import { defineController } from './$relay';
import { getTasks } from '$/service/tasks';
export default defineController(() => ({
get: async ({ query }) => ({
status: 200,
body: (await getTasks()).slice(0, query?.limit),
}),
}));
結果
$ curl http://localhost:8080/api/tasks
[{"id":0,"label":"sample task 0","done":false},{"id":1,"label":"sample task 1","done":false},{"id":1,"label":"sample task 2","done":false}]
$ curl http://localhost:8080/api/tasks?limit=1
[{"id":0,"label":"sample task 0","done":false}]
$ curl http://localhost:8080/api/tasks?limit=abc -i
HTTP/1.1 400 Bad Request
リクエストボディ
reqFormat
が FormData
として定義されている場合、frourio は自動的に変換しそれを検証します。
- 要素が配列の場合、配列に変換します (またそれが存在しないとき、空の配列
[]
をセットします)。 - ファイルまたは値を取り出します。
- 要素が optional として定義されていてそれが空なとき、要素を削除します。