Menguasai routing di Hono: definisi route dengan berbagai HTTP method, dynamic parameters dengan c.req.param(), query strings, multiple methods, base path, dan route grouping untuk modularisasi endpoint.

Setelah di episode 3 kita membuat proyek pertama dan menjalankan server, pada episode ini kita akan memahami routing — fondasi dari setiap API. Hono menawarkan pendekatan yang sangat clean untuk routing: setiap method HTTP punya fungsi dedicated, parameter diakses melalui c.req, dan validasi bisa ditambahkan dengan validator.
Hono menyediakan fungsi untuk setiap HTTP method:
import { Hono } from 'hono'
const app = new Hono()
.get('/users', (c) => c.json([]))
.post('/users', async (c) => {
const body = await c.req.json()
return c.json({ id: 1, ...body }, 201)
})
.put('/users/:id', async (c) => {
const id = c.req.param('id')
const body = await c.req.json()
return c.json({ id, ...body })
})
.delete('/users/:id', (c) => {
return c.json({ message: 'Deleted' })
})
export default appapp.on(['GET', 'POST'], '/resource', (c) => {
if (c.req.method === 'GET') return c.json([])
return c.json({ created: true }, 201)
})Parameter dinamis didefinisikan dengan prefix : di path:
app.get('/user/:id', (c) => {
const id = c.req.param('id') // otomatis string
return c.json({ id })
})app.get('/page/:id?', (c) => {
const id = c.req.param('id') // bisa undefined
return c.json({ page: id ?? 'default' })
})app.get('/search', (c) => {
const q = c.req.query('q') // string
const tags = c.req.queries('tag') // string[]
return c.json({ query: q, tags })
})const api = new Hono().basePath('/api/v1')
api.get('/users', (c) => c.json([]))
// Route lengkap: /api/v1/usersconst userRoutes = new Hono()
.get('/', (c) => c.json([]))
.post('/', async (c) => {
const body = await c.req.json()
return c.json({ id: 1, ...body }, 201)
})
const app = new Hono()
.route('/user', userRoutes)
.route('/post', postRoutes)Route userRoutes akan di-mount di /user, jadi route GET / menjadi /user/ dan POST / menjadi /user/.
const app = new Hono()
app.group('/api', (app) =>
app
.get('/users', (c) => c.json([]))
.get('/posts', (c) => c.json([]))
)Note
Route grouping memudahkan pemisahan concern — kalian bisa memisahkan route berdasarkan domain atau versi API. Untuk proyek besar, pertimbangkan memisahkan route ke file terpisah dengan pattern plugin.
Pada episode 4 ini, kalian telah menguasai fondasi routing di Hono — dari definisi route sederhana hingga dynamic parameters, query strings, dan route grouping.
Inti yang harus dibawa pulang:
c.req.param() untuk dynamic parameters, c.req.query() untuk query strings.basePath() untuk versioning, route() dan group() untuk modularisasi.app.on(['GET', 'POST'], ...).Di episode 5 selanjutnya kita akan memahami request dan response object — memahami context c secara mendalam, berbagai response types, dan cara membaca data dari request. Sampai jumpa di episode 5!