Memahami context c secara mendalam: c.req untuk request data, c.json c.text c.html c.body untuk response types, c.redirect untuk redirect, serta cara mengatur status code dan headers secara dinamis.

Setelah di episode 4 kita menguasai routing, pada episode ini kita akan memahami context c — objek sentral di Hono yang memberikan akses ke semua data request dan methods untuk menghasilkan response. Memahami c secara mendalam akan membuat kalian efektif menulis handler di Hono.
c.req adalah abstraction untuk Web Standard Request object:
app.get('/user/:id', async (c) => {
// Path parameter
const id = c.req.param('id')
// Query string
const format = c.req.query('format')
// Header
const token = c.req.header('Authorization')
// Parse body
const body = await c.req.json()
// Method
const method = c.req.method
// URL
const url = c.req.url
return c.json({ id, format, method, url })
})Di Cloudflare Workers, c.env memberikan akses ke environment variables dan bindings:
app.get('/config', (c) => {
const dbUrl = c.env.DATABASE_URL
const kv = c.env.MY_KV // Cloudflare KV binding
return c.json({ dbUrl })
})app.post('/user', async (c) => {
const body = await c.req.json<{ name: string; email: string }>()
return c.json({ received: body })
})app.post('/echo', async (c) => {
const text = await c.req.text()
return c.text(`Echo: ${text}`)
})app.post('/upload', async (c) => {
const formData = await c.req.formData()
const file = formData.get('file')
return c.json({ filename: file?.name })
})app.get('/', (c) => c.text('Hello Hono!'))app.get('/user', (c) => c.json({ name: 'John', email: 'john@example.com' }))app.get('/', (c) => c.html('<h1>Hello Hono!</h1>'))app.get('/stream', (c) => {
const stream = new ReadableStream({
start(controller) {
controller.enqueue(new TextEncoder().encode('Hello '))
controller.enqueue(new TextEncoder().encode('World!'))
controller.close()
},
})
return c.body(stream)
})app.get('/old-path', (c) => c.redirect('/new-path'))
app.get('/external', (c) => c.redirect('https://example.com'))app.post('/user', async (c) => {
const body = await c.req.json()
return c.json({ id: 1, ...body }, 201) // 201 Created
})
app.get('/missing', (c) => {
return c.json({ error: 'Not found' }, 404)
})app.get('/data', (c) => {
c.header('X-Custom-Header', 'value')
c.header('Cache-Control', 'public, max-age=3600')
return c.json({ data: 'expensive computation' })
})Note
Hono secara otomatis menentukan Content-Type berdasarkan method response. c.text() → text/plain, c.json() → application/json, c.html() → text/html. Kalian jarang perlu mengatur Content-Type secara manual.
Pada episode 5 ini, kalian telah memahami context c secara mendalam — cara membaca data request dan menghasilkan berbagai jenis response.
Inti yang harus dibawa pulang:
c.req untuk akses data request: param, query, header, json(), text(), formData().c.text(), c.json(), c.html(), c.body(), c.redirect().c.json(data, 201).c.header() untuk custom response headers.c.env untuk environment variables di Cloudflare Workers.Di episode 6 selanjutnya kita akan memahami schema validation dengan Zod dan Valibot — mendefinisikan validasi yang kuat, custom error handler, dan integrasi dengan Hono. Sampai jumpa di episode 6!