Hono + Zod で型安全な CRUD API を構築し、クライアント通信とテストを統合します。API実装、リクエスト検証、RPC通信、ローカルテストが必要な場合に使用します。
HonoとZodによる型安全なAPI開発の全ワークフローを提供します。
このスキルは以下の場合に使用してください:
// apps/server/src/routes/admin/users.ts
import { Hono } from 'hono'
import { zValidator } from '@hono/zod-validator'
import { CreateUserSchema } from '@repo/schemas/request/admin/users'
import { db } from '@repo/database'
const app = new Hono()
// POST /users - 作成
app.post('/', zValidator('json', CreateUserSchema), async (c) => {
const data = c.req.valid('json') // 型安全
const user = await db.user.create({ data })
return c.json({ user }, 201)
})
// GET /users/:id - 取得
app.get('/:id', async (c) => {
const id = c.req.param('id')
const user = await db.user.findUnique({ where: { id } })
if (!user) return c.json({ error: 'Not found' }, 404)
return c.json({ user })
})
// RPCのために型をエクスポート
export type AppType = typeof app
詳細パターン(エラーハンドリング、ページネーション、複雑なクエリ)は crud-operations.md を参照してください。
// packages/schemas/src/request/admin/users.ts
import { z } from 'zod'
import type { Prisma } from '@repo/database'
export const CreateUserSchema = z.object({
name: z.string().min(1).max(100),
email: z.string().email(),
age: z.number().int().positive().optional(),
}) satisfies z.ZodType<Prisma.UserCreateInput> // Prisma型と同期
export type CreateUserInput = z.infer<typeof CreateUserSchema>
詳細パターン(カスタムバリデーション、複雑な変換、エラーメッセージ)は validation.md を参照してください。
// apps/admin/src/utils/hc.ts
import { hc } from 'hono/client'
import type { AppType } from '@repo/server'
export const client = hc<AppType>('/api')
// apps/admin/src/swr/users/use-user.ts
export function useUser(id: string) {
return useSWR(['user', id], async () => {
return await parseResponse(client.admin.users[':id'].$get({ param: { id } })) // 完全に型付けされている
})
}
詳細パターン(型推論、エラーハンドリング、複数API統合)は rpc-client.md を参照してください。
# ドキュメントを検索
hono search "middleware"
# ドキュメントを表示
hono docs /docs/guides/middleware
# サーバー起動なしでテスト
hono request -P /api/users apps/server/src/index.ts
hono request -P /api/users -X POST -d '{"name":"Alice"}' apps/server/src/index.ts
# 本番デプロイ前に最適化(ファイルサイズ38%削減、初期化16.5倍高速化)
hono optimize apps/server/src/index.ts -o dist/server.js
詳細ワークフロー(CLIコマンド、最適化、自動化パターン)は hono-cli.md を参照してください。
c.notFound() は使用しない(RPC型を壊す)AppType をエクスポート.pick() は使わない)CreateUserSchema)packages/schemas/ に定義c.req.valid() を使用z.coerce を使用(文字列→数値の変換)AppType をエクスポートimport type)hc<AppType>() を使用InferResponseType を使用hono request は内部で app.request() を使用hono request を優先hono optimize は本番デプロイ前に実行(開発中は不要)詳細な実装パターンについては references を参照してください: