Menguasai routing di ElysiaJS: definisi route dengan berbagai HTTP method, dynamic parameters, query strings, validasi bawaan, dan route grouping untuk mengorganisir endpoint secara modular.

Setelah di episode 3 kita membuat proyek pertama dan menjalankan server, pada episode ini kita akan memahami routing — fondasi dari setiap API. ElysiaJS menawarkan pendekatan yang sangat elegan untuk routing: setiap method HTTP punya fungsi dedicated, parameter otomatis terekspos ke handler, dan validasi bawaan memastikan request selalu valid.
ElysiaJS menyediakan fungsi untuk setiap HTTP method:
import { Elysia } from 'elysia'
const app = new Elysia()
.get('/users', () => 'List users')
.post('/users', ({ body }) => `Created: ${body.name}`)
.put('/users/:id', ({ params, body }) => `Updated ${params.id}`)
.delete('/users/:id', () => `Deleted`)
.patch('/users/:id', ({ body }) => `Patched ${params.id}`)
.listen(3000)Setiap fungsi route menerima path sebagai parameter pertama, dan handler sebagai parameter kedua. Return value handler secara otomatis menjadi response.
Parameter dinamis didefinisikan dengan prefix : di path:
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/user/:id', ({ params }) => {
return { id: params.id, name: 'John' }
}, {
params: t.Object({
id: t.String(),
})
})
.listen(3000)Perhatikan bahwa params.id otomatis bertipe string — TypeBox menginferensi tipe dari schema. Kalian juga bisa menggunakan t.Numeric() untuk memastikan parameter berupa angka:
.get('/user/:id', ({ params }) => {
return { id: params.id } // params.id bertipe number
}, {
params: t.Object({
id: t.Numeric(),
})
})Query strings didefinisikan dengan parameter query di route options:
.get('/search', ({ query }) => {
return { term: query.q, page: query.page }
}, {
query: t.Object({
q: t.String(),
page: t.Optional(t.Numeric()),
})
})Jika client mengirim request tanpa query q, ElysiaJS secara otomatis mengembalikan 422 Unprocessable Entity — tidak perlu validasi manual di handler.
Untuk mendaftarkan beberapa method ke path yang sama:
import { Elysia } from 'elysia'
const app = new Elysia()
.route('/resource', {
get: () => 'Get resource',
post: ({ body }) => 'Create resource',
put: ({ body }) => 'Update resource',
delete: () => 'Delete resource',
})
.listen(3000)Ini lebih bersih daripada mendefinisikan route terpisah untuk setiap method.
Route grouping memungkinkan kalian mengorganisir endpoint ke dalam namespace:
import { Elysia } from 'elysia'
const app = new Elysia()
.group('/api/v1', (app) =>
app
.get('/users', () => 'List users')
.post('/users', ({ body }) => 'Create user')
)
.group('/api/v1', (app) =>
app
.get('/posts', () => 'List posts')
.post('/posts', ({ body }) => 'Create post')
)
.listen(3000)Grouping memudahkan pemisahan concern — kalian bisa memisahkan route berdasarkan domain (users, posts, auth) atau versi API.
Tip
Untuk proyek yang mulai tumbuh, pertimbangkan untuk memisahkan route ke file terpisah menggunakan plugin pattern — yang akan kita bahas mendalam di episode 7.
Pada episode 4 ini, kalian telah menguasai fondasi routing di ElysiaJS — dari definisi route sederhana hingga dynamic parameters, query strings, multiple methods, dan route grouping.
Inti yang harus dibawa pulang:
:param dan otomatis terekspos ke handler.query option dan divalidasi otomatis.Di episode 5 selanjutnya kita akan memahami request, response, dan type inference — memahami object context ctx, berbagai response type, status code, dan headers. Sampai jumpa di episode 5!