前面把 Hono RPC、共享 contract、统一错误响应都接起来之后,API 里其实还留着一个很明显的手工校验点:validator('json', ...) 里自己调用 PingRequestSchema.safeParse(),再手动返回失败响应。
1validator('json', (value, c) => {2const parsed = PingRequestSchema.safeParse(value)3...4})
当前项目里这一段还能工作,但它已经暴露出两个问题:
safeParse 的成功失败分支如果后面 route 变多,这种写法会越来越重复。既然已经在用 zod,又在用 Hono,最直接的做法就是把这一层换成 @hono/zod-validator 提供的 zValidator
hono/validator 是 Hono 内置的通用校验中间件,@hono/zod-validator 是 Hono 官方的 Zod 集成,把 Zod schema 变成路由中间件。替换之后的代码可以变成
1import { zValidator } from '@hono/zod-validator'23app.post('/rpc/system/ping', zValidator('json', PingRequestSchema), (c) => {4const payload = c.req.valid('json')5...6})
替换之后的有点:
safeParse