Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/pages-functions/api.md
1# Function API23## EventContext45```typescript6interface EventContext<Env = any> {7request: Request; // Incoming request8functionPath: string; // Request path9waitUntil(promise: Promise<any>): void; // Background tasks (non-blocking)10passThroughOnException(): void; // Fallback to static on error11next(input?: Request | string, init?: RequestInit): Promise<Response>;12env: Env; // Bindings, vars, secrets13params: Record<string, string | string[]>; // Route params ([user] or [[catchall]])14data: any; // Middleware shared state15}16```1718**TypeScript:** See [configuration.md](./configuration.md) for `wrangler types` setup1920## Handlers2122```typescript23// Generic (fallback for any method)24export async function onRequest(ctx: EventContext): Promise<Response> {25return new Response('Any method');26}2728// Method-specific (takes precedence over generic)29export async function onRequestGet(ctx: EventContext): Promise<Response> {30return Response.json({ message: 'GET' });31}3233export async function onRequestPost(ctx: EventContext): Promise<Response> {34const body = await ctx.request.json();35return Response.json({ received: body });36}37// Also: onRequestPut, onRequestPatch, onRequestDelete, onRequestHead, onRequestOptions38```3940## Bindings Reference4142| Binding Type | Interface | Config Key | Use Case |43|--------------|-----------|------------|----------|44| KV | `KVNamespace` | `kv_namespaces` | Key-value cache, sessions, config |45| D1 | `D1Database` | `d1_databases` | Relational data, SQL queries |46| R2 | `R2Bucket` | `r2_buckets` | Large files, user uploads, assets |47| Durable Objects | `DurableObjectNamespace` | `durable_objects.bindings` | Stateful coordination, websockets |48| Workers AI | `Ai` | `ai.binding` | LLM inference, embeddings |49| Vectorize | `VectorizeIndex` | `vectorize` | Vector search, embeddings |50| Service Binding | `Fetcher` | `services` | Worker-to-worker RPC |51| Analytics Engine | `AnalyticsEngineDataset` | `analytics_engine_datasets` | Event logging, metrics |52| Environment Vars | `string` | `vars` | Non-sensitive config |5354See [configuration.md](./configuration.md) for wrangler.jsonc examples.5556## Bindings5758### KV5960```typescript61interface Env { KV: KVNamespace; }62export const onRequest: PagesFunction<Env> = async (ctx) => {63await ctx.env.KV.put('key', 'value', { expirationTtl: 3600 });64const val = await ctx.env.KV.get('key', { type: 'json' });65const keys = await ctx.env.KV.list({ prefix: 'user:' });66return Response.json({ val });67};68```6970### D17172```typescript73interface Env { DB: D1Database; }74export const onRequest: PagesFunction<Env> = async (ctx) => {75const user = await ctx.env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(123).first();76return Response.json(user);77};78```7980### R28182```typescript83interface Env { BUCKET: R2Bucket; }84export const onRequest: PagesFunction<Env> = async (ctx) => {85const obj = await ctx.env.BUCKET.get('file.txt');86if (!obj) return new Response('Not found', { status: 404 });87await ctx.env.BUCKET.put('file.txt', ctx.request.body);88return new Response(obj.body);89};90```9192### Durable Objects9394```typescript95interface Env { COUNTER: DurableObjectNamespace; }96export const onRequest: PagesFunction<Env> = async (ctx) => {97const stub = ctx.env.COUNTER.get(ctx.env.COUNTER.idFromName('global'));98return stub.fetch(ctx.request);99};100```101102### Workers AI103104```typescript105interface Env { AI: Ai; }106export const onRequest: PagesFunction<Env> = async (ctx) => {107const resp = await ctx.env.AI.run('@cf/meta/llama-3.1-8b-instruct', { prompt: 'Hello' });108return Response.json(resp);109};110```111112### Service Bindings & Env Vars113114```typescript115interface Env { AUTH: Fetcher; API_KEY: string; }116export const onRequest: PagesFunction<Env> = async (ctx) => {117// Service binding: forward to another Worker118return ctx.env.AUTH.fetch(ctx.request);119120// Environment variable121return Response.json({ key: ctx.env.API_KEY });122};123```124125## Advanced Mode (env.ASSETS)126127When using `_worker.js`, access static assets via `env.ASSETS.fetch()`:128129```typescript130interface Env { ASSETS: Fetcher; KV: KVNamespace; }131132export default {133async fetch(request: Request, env: Env): Promise<Response> {134const url = new URL(request.url);135if (url.pathname.startsWith('/api/')) {136return Response.json({ data: await env.KV.get('key') });137}138return env.ASSETS.fetch(request); // Fallback to static139}140} satisfies ExportedHandler<Env>;141```142143**See also:** [configuration.md](./configuration.md) for TypeScript setup and wrangler.jsonc | [patterns.md](./patterns.md) for middleware and auth patterns144