From ba86316218b2887371d0cf264f775f7549e53403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 15 Dec 2025 22:26:18 +0100 Subject: [PATCH] fix: improve api route for nuxt --- .../src/runtime/server/api/[...openpanel].ts | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/sdks/nuxt/src/runtime/server/api/[...openpanel].ts b/packages/sdks/nuxt/src/runtime/server/api/[...openpanel].ts index e5b5834f..5138e57b 100644 --- a/packages/sdks/nuxt/src/runtime/server/api/[...openpanel].ts +++ b/packages/sdks/nuxt/src/runtime/server/api/[...openpanel].ts @@ -1,7 +1,10 @@ import { + type EventHandlerRequest, + type H3Event, createError, defineEventHandler, getHeader, + getRequestIP, getRequestURL, readBody, setResponseStatus, @@ -9,14 +12,14 @@ import { const API_URL = 'https://api.openpanel.dev'; -function getClientHeaders(event: any): Headers { +function getClientHeaders(event: H3Event): Headers { const headers = new Headers(); // Get IP from multiple possible headers (like Next.js does) const ip = getHeader(event, 'cf-connecting-ip') || getHeader(event, 'x-forwarded-for')?.split(',')[0] || - getHeader(event, 'x-vercel-forwarded-for'); + getRequestIP(event); headers.set('Content-Type', 'application/json'); headers.set( @@ -42,21 +45,14 @@ function getClientHeaders(event: any): Headers { return headers; } -export default defineEventHandler(async (event) => { - const path = event.context.params?._ || ''; - - // Only handle /track routes - if (!path.includes('track')) { - throw createError({ statusCode: 404, message: 'Not found' }); - } - - const apiPath = `/track${path.split('track')[1] || ''}`; - const headers = getClientHeaders(event); - +async function handleApiRoute( + event: H3Event, + apiPath: string, +) { try { const res = await fetch(`${API_URL}${apiPath}`, { method: event.method, - headers, + headers: getClientHeaders(event), body: event.method === 'POST' ? JSON.stringify(await readBody(event)) @@ -77,4 +73,18 @@ export default defineEventHandler(async (event) => { data: e instanceof Error ? e.message : String(e), }); } +} + +export default defineEventHandler(async (event) => { + const url = getRequestURL(event); + const pathname = url.pathname; + + // Handle API routes: /track/* + const apiPathMatch = pathname.indexOf('/track'); + if (apiPathMatch === -1) { + throw createError({ statusCode: 404, message: 'Not found' }); + } + + const apiPath = pathname.substring(apiPathMatch); + return handleApiRoute(event, apiPath); });