Menggunakan Zod dan Valibot untuk validasi request di Hono: mendefinisikan schema dengan z.object, integrasi @hono/zod-validator, custom error handler, dan Valibot sebagai alternatif yang lebih ringan.

Setelah di episode 5 kita memahami context c dan berbagai response types, pada episode ini kita akan mendalami validasi — lapisan pertahanan pertama melawan input yang tidak valid atau berbahaya. Hono mendukung Zod dan Valibot sebagai pilihan schema validation.
Tanpa validasi, aplikasi rentan terhadap input tidak valid, serangan berbahaya, dan bug yang sulit dideteksi. Schema validation memastikan setiap request memenuhi kontrak yang didefinisikan sebelum diproses oleh handler.
bun add zod
bun add @hono/zod-validatorimport { z } from 'zod'
const createUserSchema = z.object({
name: z.string().min(1).max(100),
email: z.string().email(),
age: z.number().min(0).max(150).optional(),
})
const paramsSchema = z.object({
id: z.string().uuid(),
})import { Hono } from 'hono'
import { zValidator } from '@hono/zod-validator'
const app = new Hono()
app.post('/user',
zValidator('json', createUserSchema),
async (c) => {
const body = c.req.valid('json')
// body otomatis typed: { name: string, email: string, age?: number }
return c.json({ id: 1, ...body }, 201)
}
)app.get('/user/:id',
zValidator('param', paramsSchema),
zValidator('query', z.object({ format: z.string().optional() })),
(c) => {
const { id } = c.req.valid('param')
const { format } = c.req.valid('query')
return c.json({ id, format })
}
)app.post('/user',
zValidator('json', createUserSchema, (result, c) => {
if (!result.success) {
return c.json({
error: 'Validation failed',
details: result.error.issues,
}, 400)
}
}),
async (c) => {
const body = c.req.valid('json')
return c.json({ id: 1, ...body }, 201)
}
)Valibot adalah alternatif Zod yang ~10x lebih ringan — cocok untuk edge computing di mana setiap byte bundle berpengaruh:
bun add valibot
bun add @hono/valibot-validatorimport * as v from 'valibot'
import { valibotValidator } from '@hono/valibot-validator'
const schema = v.object({
name: v.pipe(v.string(), v.minLength(1)),
email: v.pipe(v.string(), v.email()),
})
app.post('/user',
valibotValidator('json', schema),
(c) => {
const body = c.req.valid('json')
return c.json({ id: 1, ...body }, 201)
}
)| Aspek | Zod | Valibot |
|---|---|---|
| Bundle size | ~14KB | ~1.5KB |
| API | Object-based | Pipe-based |
| TypeScript | Excellent | Excellent |
| Hono integration | @hono/zod-validator | @hono/valibot-validator |
Tip
Untuk Cloudflare Workers atau edge deployment, Valibot lebih cocok karena bundle size-nya yang jauh lebih kecil. Untuk Node.js/Bun projects di mana bundle size bukan concern, Zod memiliki ekosistem yang lebih luas.
Pada episode 6 ini, kalian telah memahami schema validation di Hono dengan Zod dan Valibot.
Inti yang harus dibawa pulang:
zValidator() dan valibotValidator() untuk integrasi dengan Hono.Di episode 7 selanjutnya kita akan memahami middleware dan built-in helpers — CORS, JWT, compress, logger, secureHeaders, dan custom middleware. Sampai jumpa di episode 7!