Objek Konteks
Objek Context membungkus Request native dan menyediakan method yang nyaman untuk mengakses data request, mengatur response header, dan mengirim response.
Apa itu Context?
Context adalah wrapper di sekitar objek Request native Deno. Alih-alih bekerja langsung dengan Request mentah, Anda menggunakan Context yang memberi Anda:
- Lazy parsing - Data di-parse hanya saat Anda mengaksesnya
- Method yang nyaman - API sederhana untuk operasi umum
- Utility response - Method built-in untuk mengirim response
- Manajemen header - Manipulasi response header yang mudah
Mengapa Menggunakan Context?
Context menghindari multiple parsing dan pemrosesan berulang selama lifecycle request. Handler menerima satu objek Context yang bertahan melalui seluruh lifecycle — dari middleware ke route handler.
Membuat Context
Deserve membuat Context secara otomatis saat request datang:
import type { Context } from '@neabyte/deserve'
export function GET(ctx: Context): Response {
return ctx.send.json({ message: 'Hello' })
}Struktur Context
Context membungkus beberapa bagian kunci:
- Original Request - Diakses via
ctx.request - Parsed URL - Digunakan internal untuk query params
- Route Parameters - Diekstrak dari dynamic routes
- Response Headers - Diatur sebelum mengirim response
Lazy Parsing
Context menggunakan lazy parsing untuk performa:
export function GET(ctx: Context): Response {
// Query params belum di-parse
const query = ctx.query() // Di-parse pada akses pertama
// Sekarang di-cache, panggilan selanjutnya mengembalikan nilai cache
const body = await ctx.body() // Di-parse pada akses pertama
// Di-parse berdasarkan Content-Type
return ctx.send.json({ query, body })
}Akses Data Request
Akses data request melalui method Context:
- Query Parameters -
ctx.query(),ctx.queries() - Route Parameters -
ctx.param(),ctx.params() - Headers -
ctx.header(),ctx.headers - Cookies -
ctx.cookie() - Body -
ctx.body(),ctx.json(),ctx.formData(),ctx.text(),ctx.arrayBuffer(),ctx.blob() - Informasi URL -
ctx.url,ctx.pathname
Utility Response
Kirim response menggunakan ctx.send:
ctx.send.json()- Response JSONctx.send.text()- Plain textctx.send.html()- Konten HTMLctx.send.file()- Unduhan filectx.send.data()- Unduhan data in-memoryctx.send.redirect()- Redirectctx.send.custom()- Response customctx.handleError()- Error handling
Anda juga dapat menggunakan ctx.redirect() secara langsung sebagai method convenience:
export function GET(ctx: Context): Response {
return ctx.redirect('/new-location', 301)
// Setara dengan: ctx.send.redirect('/new-location', 301)
}Response Headers
Atur response header sebelum mengirim:
export function GET(ctx: Context): Response {
ctx.setHeader('X-Custom', 'value')
ctx.setHeader('Cache-Control', 'no-cache')
return ctx.send.json({ data: 'test' })
}Mengatur Multiple Headers
Gunakan setHeaders() untuk mengatur multiple headers sekaligus:
export function GET(ctx: Context): Response {
ctx.setHeaders({
'X-Custom': 'value',
'Cache-Control': 'no-cache',
'X-Request-ID': 'abc123'
})
return ctx.send.json({ data: 'test' })
}Membaca Response Headers
Akses semua response headers yang telah diatur:
export function GET(ctx: Context): Response {
ctx.setHeader('X-Custom', 'value')
ctx.setHeader('Cache-Control', 'no-cache')
const headers = ctx.responseHeadersMap // { 'X-Custom': 'value', 'Cache-Control': 'no-cache' }
return ctx.send.json({ data: 'test' })
}URL dan Pathname
Dapatkan informasi URL langsung:
ctx.url- String URL lengkapctx.pathname- Bagian pathname dari URL (contoh:/api/users/123)
export function GET(ctx: Context): Response {
const fullUrl = ctx.url // 'http://localhost:8000/api/users/123?sort=name'
const path = ctx.pathname // '/api/users/123'
return ctx.send.json({ path, fullUrl })
}Penanganan Error
Tangani error secara konsisten menggunakan ctx.handleError():
export function GET(ctx: Context): Response {
try {
if (!isAuthorized) {
return ctx.handleError(401, new Error('Unauthorized'))
}
return ctx.send.json({ data: 'success' })
} catch (error) {
return ctx.handleError(500, error as Error)
}
}Cara Kerja
ctx.handleError() menghormati error handler global yang diatur dengan router.catch():
- Jika
router.catch()didefinisikan - Menggunakan error handler kustom Anda - Jika tidak ada error handler - Mengembalikan response sederhana dengan status code
Gunakan di Middleware
Middleware dapat menggunakan ctx.handleError() untuk memicu error handling:
router.use(async (ctx, next) => {
if (!isValid) {
return ctx.handleError(401, new Error('Unauthorized'))
// Ini akan menggunakan router.catch() jika didefinisikan
}
return await next()
})Lifecycle Context
- Request datang - Deserve membuat Context dengan Request dan URL
- Route matching - Route parameters diekstrak dan ditambahkan ke Context
- Eksekusi middleware - Context dilewatkan melalui middleware chain
- Route handler - Handler Anda menerima Context
- Response dikirim - Method Context digunakan untuk membangun Response