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\n at node:internal/deps/undici/undici:13510:13\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async i (/var/task/.next/server/app/api/default/route.js:1:4069)\n at async rb.do (/var/task/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:5:21059)\n at async rb.handle (/var/task/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:5:25902)\n at async k (/var/task/.next/server/app/api/default/route.js:1:8196)\n at async rb.handleResponse (/var/task/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:1:104401)\n at async g (/var/task/.next/server/app/api/default/route.js:1:9199)\n at async C (/var/task/.next/server/app/api/default/route.js:1:10321)\n 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”
