Memahami object context ctx secara mendalam: params, query, body, headers, cookie, serta berbagai opsi response dari string hingga Response class dan cara mengatur status code serta headers secara dinamis.

Setelah di episode 4 kita menguasai routing — dynamic parameters, query strings, dan route grouping — pada episode ini kita akan memahami bagaimana cara membaca data dari request dan menghasilkan response. ElysiaJS menyediakan object context yang powerful untuk mengakses semua data request secara type-safe.
Setiap route handler menerima object context yang berisi semua data dari request. Semua property di context otomatis terekspos berdasarkan schema yang didefinisikan:
import { Elysia, t } from 'elysia'
const app = new Elysia()
.post('/user/:id', ({ params, query, body, headers, cookie, set }) => {
// params: path parameters
// query: query string
// body: request body
// headers: request headers
// cookie: cookie handler
// set: response configuration
return { userId: params.id, name: body.name }
}, {
params: t.Object({ id: t.String() }),
query: t.Object({ format: t.Optional(t.String()) }),
body: t.Object({
name: t.String(),
email: t.String({ format: 'email' }),
}),
})
.listen(3000)Headers diakses melalui object headers — semua header otomatis terekspos sebagai string atau array:
.get('/protected', ({ headers }) => {
const token = headers.authorization?.split(' ')[1]
return { token }
})Cookie diakses melalui object cookie — kalian bisa membaca, menulis, dan menghapus cookie:
.get('/login', ({ cookie }) => {
cookie.session.set('abc123', {
httpOnly: true,
secure: true,
})
return { message: 'Logged in' }
})ElysiaJS mendukung berbagai cara mengembalikan response:
.get('/', () => 'Hello Elysia!')
// Content-Type: text/plain.get('/user', () => ({
name: 'John',
email: 'john@example.com',
}))
// Content-Type: application/jsonUntuk kontrol penuh, gunakan Response bawaan:
.get('/data', () => {
return Response.json(
{ users: [] },
{ status: 200, headers: { 'X-Custom': 'value' } }
)
})Gunakan object set untuk mengatur status code dan response headers secara dinamis:
.post('/user', ({ body, set }) => {
set.status = 201
set.headers['X-Request-Id'] = crypto.randomUUID()
return { id: 1, name: body.name }
}, {
body: t.Object({
name: t.String(),
email: t.String(),
})
})Atau gunakan new Response untuk kasus yang lebih kompleks:
.get('/user/:id', ({ params, set }) => {
set.status = 404
return { error: 'User not found' }
})Note
ElysiaJS secara otomatis menentukan Content-Type berdasarkan return value. Untuk string → text/plain, object → application/json, Uint8Array → application/octet-stream. Kalian jarang perlu mengatur Content-Type secara manual.
Pada episode 5 ini, kalian telah memahami object context secara mendalam — cara membaca data request dan menghasilkan berbagai jenis response.
Inti yang harus dibawa pulang:
ctx berisi params, query, body, headers, cookie, dan set.set.status dan set.headers untuk mengatur status code dan headers secara dinamis.cookie di context.Di episode 6 selanjutnya kita akan memahami schema validation dengan TypeBox — bagaimana mendefinisikan validasi yang kuat, nested objects, optional fields, dan custom error handling. Sampai jumpa di episode 6!