Timed out while waiting for a response. Api Route

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 :frowning:

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”

https://yapoki.vercel.app/kurgan

solved. blocking roskomnadzor

How did you solve it?

our hosting added our API’s ip to the exception

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.