라우트 핸들러
풀스택 app/api/*/route.ts 핸들러, 재작성과 로컬 데몬 프록시.
라우트 핸들러는 Web Request와 Response API로 app 디렉터리에 API 엔드포인트를 정의해요.
규칙
app/api/health/route.tsts
export function GET(): Response { return Response.json({ status: "ok" });}GET, POST, PUT, PATCH, DELETE, HEAD 또는 OPTIONS를 내보내세요. 핸들러는 text dev, text start와 모든 서버 배포 어댑터에서 미들웨어 다음에 실행돼요. 라우트 세그먼트 설정으로 GET 핸들러를 캐시하세요.
동적 핸들러
app/api/sessions/[id]/route.tsts
export async function GET(_req: Request, { params }: { params: { id: string } }) { const session = await db.sessions.find(params.id); return session ? Response.json(session) : new Response("Not found", { status: 404 });}params 값은 디코딩돼요. 인코딩된 슬래시나 백슬래시(%2F, %5C)가 있는 경로는 400 응답을 받으므로, /가 포함될 수 있는 ID는 쿼리 매개변수로 전달하거나 base64url로 인코딩하세요.
스트리밍
서버 전송 이벤트에는 ReadableStream을 반환하세요:
app/api/ticks/route.tsts
export function GET() { let n = 0; const stream = new ReadableStream({ start(c) { setInterval(() => c.enqueue(`data: ${n++}\n\n`), 1000); }, }); return new Response(stream, { headers: { "content-type": "text/event-stream" } });}Rewrite
서버가 외부 대상 요청을 프록시하므로 브라우저는 교차 출처 요청을 보내지 않아요.
text.config.tsts
export default defineConfig({ rewrites: [{ source: "/api/opencode/:path*", destination: "http://127.0.0.1:4096/:path*" }],});로컬 데몬 프록시
컴퓨터에서 실행 중인 프로세스에 연결하려면 proxy를 사용하세요:
text.config.tsts
export default defineConfig({ proxy: { "/api/opencode": { target: "http://127.0.0.1:4096", changeOrigin: true } },});OpenCode 템플릿은 이 방식으로 로컬 서버에 연결해요.