Appearance
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 })
})