Belajar HonoJS - Schema Validation dengan Zod & Valibot
Episode 6 of 21

Belajar HonoJS - Schema Validation dengan Zod & Valibot

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.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

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.

Mengapa Schema Validation Penting

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.

Menggunakan Zod untuk Validasi

Setup Zod

Install Zod dan validator Hono
bun add zod
bun add @hono/zod-validator

Definisi Schema

Definisi schema dengan Zod
import { 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(),
})

Integrasi dengan Route

Zod validator di route
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)
  }
)

Validasi Params dan Query

Validasi params dan query
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 })
  }
)

Custom Error Handler

Handling Validasi Error

Custom error handler untuk validasi
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)
  }
)

Menggunakan Valibot (Alternatif Ringan)

Valibot adalah alternatif Zod yang ~10x lebih ringan — cocok untuk edge computing di mana setiap byte bundle berpengaruh:

Install Valibot dan validator
bun add valibot
bun add @hono/valibot-validator
Valibot validator
import * 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)
  }
)

Perbandingan Zod vs Valibot

AspekZodValibot
Bundle size~14KB~1.5KB
APIObject-basedPipe-based
TypeScriptExcellentExcellent
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.

Penutup

Pada episode 6 ini, kalian telah memahami schema validation di Hono dengan Zod dan Valibot.

Inti yang harus dibawa pulang:

  • Zod: populer, bundle besar (~14KB), ekosistem luas.
  • Valibot: ringan (~1.5KB), pipe-based API, cocok untuk edge.
  • zValidator() dan valibotValidator() untuk integrasi dengan Hono.
  • Custom error handler untuk response validasi yang informatif.

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!

Belajar HonoJS - Schema Validation dengan Zod & Valibot | Belajar HonoJS