Context (ctx)
Objek request & respons yang diterima setiap handler.
Setiap handler route dan middleware menerima ctx bertipe ZenContext.
import type { ZenContext } from "zentara";
export async function GET(ctx: ZenContext) {
return { path: ctx.path, id: ctx.params.id, q: ctx.query.q };
}| Properti | Isi |
|---|---|
method |
method HTTP, mis. "GET" |
path · url |
pathname dan objek URL lengkap |
query |
query string (?tag=a&tag=b menjadi { tag: ["a", "b"] }) |
params |
parameter route dinamis, mis. { id: "5" } untuk users/[id].ts |
state |
tempat berbagi data antar-middleware selama satu request (mis. user yang login) |
cookies |
baca & tulis cookie |
session |
session terenkripsi (butuh middleware session()) |
logger |
logger aplikasi |
req · res |
objek http asli Node.js |
await ctx.json() · ctx.text() · ctx.body() |
body request sebagai JSON, teks, atau Buffer |
#Mengembalikan respons
| Nilai yang di-return | Hasil |
|---|---|
string |
HTML (text/html) |
| object / array | JSON |
undefined |
204 No Content |
json(data, { status }) · html(markup, { status }) · text(...) |
status & header kustom |
redirect("/", 303) |
redirect |
throw new HttpError(404, "Produk tidak ditemukan") |
respons error (JSON untuk API, halaman error untuk browser) |
import { html, HttpError, json, redirect, type ZenContext } from "zentara";
export async function POST(ctx: ZenContext) {
const data = await ctx.json<{ nama?: string }>();
if (!data?.nama) throw new HttpError(422, "Nama wajib diisi");
return json({ ok: true, nama: data.nama }, { status: 201 });
}Tidak ada ctx.status: atur status lewat json(), html(), text(), atau redirect().