Skip to content
On this page

hono-zod-validator

简介

hono-zod-validator 是 Hono 框架的一个中间件,它使用 Zod 库来验证请求数据,包括请求体、查询参数、路由参数和请求头。这个中间件可以帮助开发者轻松实现请求数据的类型安全验证,并提供完整的 TypeScript 类型推断支持。

安装

bash
npm install hono @hono/zod-validator zod

基本使用

typescript
import { Hono } from 'hono'
import { z } from 'zod'
import { zValidator } from '@hono/zod-validator'

const app = new Hono()

// 定义验证模式
const schema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
  age: z.number().int().positive().optional(),
})

// 使用中间件验证请求体
app.post('/users', zValidator('json', schema), (c) => {
  // 验证通过后,可以安全地访问请求数据
  const data = c.req.valid('json')

  // data 已经是类型安全的对象
  console.log(data.name, data.email, data.age)

  return c.json({ success: true, data })
})

app.listen(3000)

高级配置

typescript
import { Hono } from 'hono'
import { z } from 'zod'
import { zValidator } from '@hono/zod-validator'

const app = new Hono()

// 查询参数验证
const querySchema = z.object({
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().default(10),
})

// 路由参数验证
const paramsSchema = z.object({
  id: z.coerce.number().int().positive(),
})

// 请求头验证
const headerSchema = z.object({
  'x-api-key': z.string().min(32),
})

// 组合多种验证
app.get(
  '/users/:id',
  zValidator('query', querySchema),
  zValidator('param', paramsSchema),
  zValidator('header', headerSchema),
  (c) => {
    // 获取验证后的数据
    const query = c.req.valid('query')
    const params = c.req.valid('param')
    const headers = c.req.valid('header')

    return c.json({
      id: params.id,
      page: query.page,
      limit: query.limit,
      apiKey: headers['x-api-key'].substring(0, 5) + '...',
    })
  },
)

// 自定义错误处理
app.post(
  '/api/data',
  zValidator('json', schema, {
    onError: (e, c) => {
      return c.json(
        {
          success: false,
          message: '验证失败',
          errors: e.errors,
        },
        400,
      )
    },
  }),
  (c) => {
    const data = c.req.valid('json')
    return c.json({ success: true, data })
  },
)

更多用法

验证表单数据

typescript
import { Hono } from 'hono'
import { z } from 'zod'
import { zValidator } from '@hono/zod-validator'

const app = new Hono()

const formSchema = z.object({
  name: z.string(),
  email: z.string().email(),
  age: z.string().transform((val) => parseInt(val, 10)),
})

app.post('/form', zValidator('form', formSchema), (c) => {
  const data = c.req.valid('form')
  return c.json({ success: true, data })
})

组合多个验证器

typescript
import { Hono } from 'hono'
import { z } from 'zod'
import { zValidator } from '@hono/zod-validator'

const app = new Hono()

// 创建组合验证器
const userValidator = zValidator(
  'json',
  z.object({
    name: z.string(),
    email: z.string().email(),
  }),
)

const adminValidator = zValidator(
  'header',
  z.object({
    'x-admin-key': z.string().min(32),
  }),
)

// 组合使用
app.post('/admin/users', userValidator, adminValidator, (c) => {
  const userData = c.req.valid('json')
  const adminData = c.req.valid('header')

  return c.json({ success: true })
})

与 TypeScript 集成

typescript
import { Hono } from 'hono'
import { z } from 'zod'
import { zValidator } from '@hono/zod-validator'

// 定义验证模式并导出类型
const userSchema = z.object({
  name: z.string(),
  email: z.string().email(),
  role: z.enum(['admin', 'user', 'guest']),
})

// 从 Zod 模式导出 TypeScript 类型
type User = z.infer<typeof userSchema>

const app = new Hono()

app.post('/users', zValidator('json', userSchema), (c) => {
  // data 的类型为 User
  const data: User = c.req.valid('json')

  return c.json({ success: true, data })
})

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命