fix: improve api route for nuxt

This commit is contained in:
Carl-Gerhard Lindesvärd
2025-12-15 22:26:18 +01:00
parent 684cba9c84
commit ba86316218

View File

@@ -1,7 +1,10 @@
import { import {
type EventHandlerRequest,
type H3Event,
createError, createError,
defineEventHandler, defineEventHandler,
getHeader, getHeader,
getRequestIP,
getRequestURL, getRequestURL,
readBody, readBody,
setResponseStatus, setResponseStatus,
@@ -9,14 +12,14 @@ import {
const API_URL = 'https://api.openpanel.dev'; const API_URL = 'https://api.openpanel.dev';
function getClientHeaders(event: any): Headers { function getClientHeaders(event: H3Event<EventHandlerRequest>): Headers {
const headers = new Headers(); const headers = new Headers();
// Get IP from multiple possible headers (like Next.js does) // Get IP from multiple possible headers (like Next.js does)
const ip = const ip =
getHeader(event, 'cf-connecting-ip') || getHeader(event, 'cf-connecting-ip') ||
getHeader(event, 'x-forwarded-for')?.split(',')[0] || getHeader(event, 'x-forwarded-for')?.split(',')[0] ||
getHeader(event, 'x-vercel-forwarded-for'); getRequestIP(event);
headers.set('Content-Type', 'application/json'); headers.set('Content-Type', 'application/json');
headers.set( headers.set(
@@ -42,21 +45,14 @@ function getClientHeaders(event: any): Headers {
return headers; return headers;
} }
export default defineEventHandler(async (event) => { async function handleApiRoute(
const path = event.context.params?._ || ''; event: H3Event<EventHandlerRequest>,
apiPath: string,
// 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);
try { try {
const res = await fetch(`${API_URL}${apiPath}`, { const res = await fetch(`${API_URL}${apiPath}`, {
method: event.method, method: event.method,
headers, headers: getClientHeaders(event),
body: body:
event.method === 'POST' event.method === 'POST'
? JSON.stringify(await readBody(event)) ? JSON.stringify(await readBody(event))
@@ -77,4 +73,18 @@ export default defineEventHandler(async (event) => {
data: e instanceof Error ? e.message : String(e), 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);
}); });