请求验证
TypeScript 类型不能验证真实请求。公开 API 必须在运行时检查 JSON、查询参数、表单数据和路径参数。
Hono 自带轻量 validator,也常与 @hono/zod-validator、Zod 搭配使用。
使用 validator
import { validator } from 'hono/validator'
app.post(
'/posts',
validator('json', (value, c) => {
const title = value['title']
if (typeof title !== 'string' || title.trim() === '') {
return c.json({ message: 'title is required' }, 400)
}
return {
title: title.trim(),
}
}),
(c) => {
const input = c.req.valid('json')
return c.json({ id: 1, title: input.title }, 201)
},
)
验证通过后,通过 c.req.valid('json') 读取整理后的值。
使用 Zod Validator
先安装:
pnpm add zod @hono/zod-validator
定义 schema:
import { z } from 'zod'
import { zValidator } from '@hono/zod-validator'
const createPostSchema = z.object({
title: z.string().min(1).max(100),
body: z.string().min(1),
})
app.post('/posts', zValidator('json', createPostSchema), (c) => {
const input = c.req.valid('json')
return c.json({ id: crypto.randomUUID(), ...input }, 201)
})
验证查询参数
const listQuerySchema = z.object({
page: z.coerce.number().int().positive().default(1),
pageSize: z.coerce.number().int().min(1).max(100).default(20),
})
app.get('/posts', zValidator('query', listQuerySchema), (c) => {
const query = c.req.valid('query')
return c.json(query)
})
查询参数本来都是字符串,z.coerce.number() 可以把字符串转为数字。
验证表单
const contactSchema = z.object({
email: z.string().email(),
message: z.string().min(1).max(1000),
})
app.post('/contact', zValidator('form', contactSchema), (c) => {
const form = c.req.valid('form')
return c.json({ received: true, email: form.email })
})
验证建议
- 所有外部输入都要验证,包括请求体、查询参数、路径参数和 Header。
- 验证器返回的对象应尽量是业务代码真正需要的结构。
- 错误响应要稳定,方便前端展示和测试断言。
- 不要把数据库层错误当作输入验证。输入错误应该在进入业务逻辑之前处理。
相关内容
- Hono 是什么 介绍 Hono 的定位、核心特点、Web Standards 思路、多运行时能力,以及它与传统 Node.js Web 框架的差异。
- 安装和 Hello World 学习使用 create-hono 创建 Hono 项目,分别了解通用模板和 Node.js 模板的 Hello World 写法。
- 运行时选择 对比 Hono 在 Node.js、Cloudflare Workers、Bun、Deno 等运行时中的入口写法、部署方式和适用场景。
- 路由基础 学习 Hono 的 GET、POST、动态参数、通配符、路由分组和模块化路由写法。
- Context 详解 介绍 Hono Context 的 req、json、text、html、redirect、header、status、set、get 等常用 API。
- 中间件机制 学习 Hono 中间件的执行顺序、自定义中间件写法、路径匹配、next 调用和常见使用场景。