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

自動バリデーション

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 に変換します。
Deprecated

また 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

リクエストボディ

reqFormatFormData として定義されている場合、frourio は自動的に変換しそれを検証します。

  1. 要素が配列の場合、配列に変換します (またそれが存在しないとき、空の配列 [] をセットします)。
  2. ファイルまたは値を取り出します。
  3. 要素が optional として定義されていてそれが空なとき、要素を削除します。