Hi, there is a route src\app\api\default\route.ts
import { NextRequest } from 'next/server';import { nextApiRequest } from '@/utils/api/nextApiRequest';import { API_URL } from '@/app/constants';
export *async* function POST(req: NextRequest) {
*return* nextApiRequest(\`${API_URL}request\`, req);
}Preformatted text not working next code :(
export async function nextApiRequest(endpoint: string, req: NextRequest) { const contentType = req.headers.get('content-type')?.toLowerCase() || ''; const isFormData = contentType.startsWith('multipart/form-data');
let parsedBody = null; try { parsedBody = isFormData ? await req.formData() : await req.json(); } catch { parsedBody = null; }
try { const { phone, token } = await getIronSession<ISessionAuthData>( await cookies(), ironSessionOptions, );
const headers: Record<string, string> = { Accept: 'application/json', 'Content-Encoding': 'utf-8', 'Access-Control-Allow-Origin': '*', Token: token, Phone: phone, ...(isFormData ? {} : { 'Content-Type': 'application/json' }), };
const response = await fetch(endpoint, { method: 'POST', headers, body: isFormData ? (parsedBody as FormData) : JSON.stringify(parsedBody), });
const responseContentType = response.headers.get('content-type')?.toLowerCase() || ''; const isJsonResponse = responseContentType.includes('application/json');
if (!response.ok) { if (response.status === 401) { (await cookies()).delete(AUTH_COOKIE_NAME); }
const errorText = isJsonResponse ? await response.json() : await response.text(); return NextResponse.json( { message: `Request failed with status ${response.status}`, error: errorText }, { status: response.status }, ); }
const data = isJsonResponse ? await response.json() : await response.text(); return NextResponse.json(data, { status: 200 }); } catch (error) { const errorDetails = { message: 'Internal Server Error', errorName: (error as Error).name, errorMessage: (error as Error).message, errorStack: (error as Error).stack, errorString: (error as Error).toString(), errorRaw: error, timestamp: new Date().toISOString(), endpoint, requestDetails: { method: 'POST', headers: Object.fromEntries(req.headers.entries()), body: parsedBody, }, };
console.error('API Proxy Error:', JSON.stringify(errorDetails, null, 2));
return NextResponse.json(errorDetails, { status: 500, headers: { 'X-Error-Details': 'true', }, }); }}in .env API_URL=https://mysite.net:9001/api/
I go to the site, refresh, requests go to this route - errors 500
Sometimes it happens that some go through successfully
in the log:

2025-09-03T12:35:09.847Z [error] API Proxy Error: { "message": "Internal Server Error", "errorName": "TypeError", "errorMessage": "fetch failed", "errorStack": "TypeError: fetch failed at node:internal/deps/undici/undici:13510:13 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async i (/var/task/.next/server/app/api/default/route.js:1:4069) at async rb.do (/var/task/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:5:21059) at async rb.handle (/var/task/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:5:25902) at async k (/var/task/.next/server/app/api/default/route.js:1:8196) at async rb.handleResponse (/var/task/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:1:104401) at async g (/var/task/.next/server/app/api/default/route.js:1:9199) at async C (/var/task/.next/server/app/api/default/route.js:1:10321) at async ev (/var/task/node_modules/next/dist/compiled/next-server/server.runtime.prod.js:13:30818)", "errorString": "TypeError: fetch failed", "errorRaw": {}, "timestamp": "2025-09-03T12:35:09.846Z", "endpoint": "https://mysite.net:9001/api/request", "requestDetails": { "method": "POST", "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,th;q=0.6", "cache-control": "no-cache", "connection": "close", "content-length": "173", "content-type": "application/json", "cookie": "auth=Fe26.2*1*06681b01b2c3a401a72c862fe8d42a0313f38436f64cf05ce7767333c2d200f3*NqITztkbiWr3KEo1uDYA0g*98Pup4BydBxlal3p893gkc6NgtGO4bX-r5KWXxXipzQpAtRCoWm5wrQWglS_0ikEt8-KMNCzoE8xV-2ZUImJIUTC0qOq2j83GipxM7657yh9ZX95bPT-A4bCv-jprucPJ9Hki6NL9ltY6yHBE7urwg*1778584486054*130c3f9e386e15018366a052c8eb0eff51241b970fcdbceae16394c5ff877079*UoUxw71F5_jjtnI3FEoDDBB-5-v2wAeIGB3gnvV62Ak~2; suggestedActions=true; suggestedAddress=true; __vercel_toolbar=1; city=%22kurgan%22; contiguousPointHash=%228d530b253ab52715733e6d92caa19cbcf5edfb43f63311970d3ed5af7265763302a2a29843231753616c4f8b64a8d1602800ea2303caca35477ff6bc09d15231%22", "forwarded": "for=91.79.197.154;host=yapoki.vercel.app;proto=https;sig=0QmVhcmVyIGEyODcyODRhODRlMWU0ZmYwMTAwMDk5NzRiZWI4NThiMzVmZThgmVjMTgyNTlhMzI1YWYwMDIxZDA1NDQ=;exp=1756903199", "host": "yapoki.vercel.app", "origin": "https://yapoki.vercel.app", "pragma": "no-cache", "priority": "u=1, i", "referer": "https://yapoki.vercel.app/kurgan/snack", "sec-ch-ua": "\"Not;A=Brand\";v=\"99\", \"Google Chrome\";v=\"139\", \"Chromium\";v=\"139\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", "x-forwarded-for": "91.79.197.154", "x-forwarded-host": "yapoki.vercel.app", "x-forwarded-port": "443", "x-forwarded-proto": "https", "x-matched-path": "/api/default", "x-real-ip": "91.79.197.154", "x-vercel-deployment-url": "yapoki-i3gt0f9h5-yapoki.vercel.app", "x-vercel-firewall-bypass": "true", "x-vercel-forwarded-for": "91.79.197.154", "x-vercel-id": "arn1::hxmjd-1756902899320-f415519f1514", "x-vercel-internal-bot-check": "skip", "x-vercel-internal-ingress-bucket": "bucket018", "x-vercel-internal-ingress-port": "18446", "x-vercel-ip-as-number": "8359", "x-vercel-ip-city": "Perm", "x-vercel-ip-continent": "EU", "x-vercel-ip-country": "RU", "x-vercel-ip-country-region": "PER", "x-vercel-ip-latitude": "58.0047", "x-vercel-ip-longitude": "56.2514", "x-vercel-ip-postal-code": "614000", "x-vercel-ip-timezone": "Asia/Yekaterinburg", "x-vercel-ja4-digest": "t13d1517h2_8daaf6152771_b6f405a00624", "x-vercel-oidc-token": "eyJraWQiOiJtcmstNDMwMmVjMWI2NzBmNDhhOThhZDYxZGFkZTRhMjNiZTciLCJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE3NTY5MDEwNTUsIm93bmVyX2lkIjoidGVhbV9kY2NhRUFWVW42Z29TRVQ0ZlEyVlIwMHIiLCJpYXQiOjE3NTY5MDEwNTUsInZlcmNlbF9pZCI6ImFybjE6Om44N3dwLTE3NTY5MDEwNTUyMjctYjI5YzY3ZWY3ZDU2IiwiYXVkIjoiaHR53sfXC9cL3ZlcmNlbC5jb21cL3lhcG9raSIsIm93bmVyIjoieWFwb2tpIiwiaXNzIjoiaHR0cHM6XC9cL29pZGMudmVyY2VsLmNvbVwveWFwb2tpIiwicHJvamVjdF9pZCI6InByal9QYUtlbjdHNFNzMk9yUE42U2ZTZ05FWE1xRGNvIiwiZXhwIjoxNzU2OTA0NjU1LCJlbnZpcm9ubWVudCI6InByb2R1Y3Rpb24iLCJzY29wZSI6Im93bmVyOnlhcG9raTpwcm9qZWN0OnlhcG9raTplbnZpcm9ubWVudDpwcm9kdWN0aW9uIiwic3ViIjoib3duZXI6eWFwb2tpOnByb2plY3Q6eWFwb2tpOmVudmlyb25tZW50OnByb2R1Y3Rpb24iLCJwcm9qZWN0IjoieWFwb2tpIn0.gfX2ts5tiQTYhN39bQ1rBMPKkgxyEh4TxFRvXJySgVW6OlAOuC9SRlSZn_qouNQQdtynYbMSMYsTmFgoklOVrd8caTLt-VUjtOBQjGJhDe2633oOunuuuq1c1WcJ8QYq8ZYCOipgXrUenVKIIE45vSDWFc-N3mXlAae1bOA7aAbrtVqgz8zyDAvAUSl2IpDM-Mn9DvLVzcklSlsU2QQT49vuUjakNADoqwn-GL1GqcuWa_SBG57gxKamEbbW5zsErP0jQfth_HSPse_o0FU69p1l1pOUemcEvN1azlrPx761aH5r0GAi1qNLv0qFHcvO63cYt3K8rNcJqH9JkzHW1w", "x-vercel-proxied-for": "91.79.197.154", "x-vercel-proxy-signature": "Bearer a287284a84e1e4ff010009974beb234ds5fe8c139fec18259a455af0021d0544", "x-vercel-proxy-signature-ts": "1756902459", "x-vercel-sc-basepath": "", "x-vercel-sc-headers": "{\"x-vercel-function-platform\":\"vercel\\/proxy+serverless\",\"x-vercel-ept\":\"1\",\"Authorization\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkZXBsb3ltZW50SWQiOiJkcGxfR2dmVVBVRGNlWEJ2UlNhbzNRbmNEeW5zeEJvZiIsInVubGltaXRlZCI5643fnBsYW4iOiJwcm8iLCJpc3MiOiJzZXJ2ZXJsZXNzIiwiZG9tYWluIjoieWFwb2tpLnZlcmNlbC5hcHAiLCJibG9jayI6ZmFsc2UsImlhdCI6MTc1NjkwMjg5OSwicHJvamVjdElkIjoicHJqX1BhS2VuN0c0U3MyT3JQTjZTZlNnTkVYTXFEY28iLCJleHAiOjE3NTY5MDM4MTksIm93bmVySWQiOiJ0ZWFtX2RjY2FFQVZVbjZnb1NFVDRmUTJWUjAwciIsInJlcXVlc3RJZCI6Imh4bWpkLTE3NTY5MDI4OTkzMjAtZjQxNTUxOWYxNTE0IiwiZW52IjoicHJvZHVjdGlvbiJ9.0ob5sfYuM5oEACIegTmGw5gFRm6AFPeqqdqP7wVavqI\"}", "x-vercel-sc-host": "fra1.suspense-cache.vercel-infra.com" }, "body": { "Tables": [ { "Name": "ClientInfo", "TypeParameter": "Phone", "Values": [ "8888888888" ] } ], "RequestInfo": { "SessionHash": "ds" }, "Service": "ClientInfo", "Query": "Select", "PointHash": "" } }}vercel CLI node 20.x "next": "^15.4.4"