Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Honoを技術選定したAI要件定義プラットフォームAcsimでの意思決定

 Honoを技術選定したAI要件定義プラットフォームAcsimでの意思決定

☁ イベント
Cloudflare Workers Tech Talks in Fukuoka #1
https://workers-tech.connpass.com/event/365623/

▲ Acsim (アクシム) について
Home: https://ai.acsim.app/

⬢ 株式会社ROUTE06 (ルートシックス) について
会社情報: https://route06.com/jp

Avatar for Tadashi Shigeoka

Tadashi Shigeoka

November 12, 2025
Tweet

More Decks by Tadashi Shigeoka

Other Decks in Programming

Transcript

  1. 自己紹介 重岡 正 (SHIGEOKA Tadashi) 株式会社ROUTE06 取締役 CTO / Co-founder

    普段はフルリモートワーク 🏠 本日は熊本からやって参りました 🚄 2
  2. なぜHonoか: @hono/zod-openapi の選定理由 1. TypeScriptネイティブな記述 const route = createRoute({ method:

    'post', path: '/users', request: { body: { content: { 'application/json': { schema: UserSchema } } } }, responses: { 200: { content: { 'application/json': { schema: UserSchema } } } } }); YAML/JSONではなくTypeScriptで記述可能 学習コストが低い 5
  3. なぜorvalか: Frontend側のコード生成 TanStack Queryとの親和性 // 自動生成されたコード export const useGetUsers =

    () => { return useQuery({ queryKey: ['users'], queryFn: () => getUsersApi(), }); }; TanStack Query用のhooksを自動生成 Query Key管理を自動化 リクエスト処理を簡略化 7
  4. 実装のポイント export const createResponsesAndMiddleware = <T extends z.ZodSchema, U extends

    ContentfulStatusCode>({ response, middleware: _middleware = [], }: { response: { schema: T; status: U; description: string }; middleware?: MiddlewareHandler[]; }) => { const { schema, status, description } = response; const responses: { [key in U]: { content: { "application/json": { schema: T } }; description: string } } = { [status]: { content: { "application/json": { schema, }, }, description, }, }; // レスポンススキーマバリデーションミドルウェアを自動で適用 const middleware = [responseSchemaValidationMiddleware(schema, status), ..._middleware]; return { responses, middleware }; }; 13
  5. 実装のポイント export const responseSchemaValidationMiddleware = <T extends ZodSchema, U extends

    ContentfulStatusCode>( schema: T, status: U ): MiddlewareHandler => { return async (c, next) => { await next(); // 成功ステータスコード(200-299)のJSONレスポンスのみを検証 if (c.res.headers.get("Content-Type") !== "application/json") return; if (!isSuccessStatusCode(c.res.status)) return; const responseData = await c.res.json(); const result = schema.safeParse(responseData); if (!result.success) { // パース失敗時は500エラーを返し、問題を即座に検出 c.res = c.json({ message: "Response schema validation failed", errors: result.error.flatten().fieldErrors }, 500); return; } // ZodのsafeParseにより余分なプロパティを安全に除外 c.res = c.json(result.data, status); }; }; 14
  6. まとめ Honoを選んだ理由 1. TypeScriptネイティブな開発体験 2. スキーマ駆動開発による型安全性 3. TanStack Queryとの高い親和性 4.

    学習コストの低さ 結果 型安全な開発体験の実現 開発速度の向上 保守性の高いコードベース 16