Задать вопрос
Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

Почему при build проекта на Next js ошибка TypeError: fetch failed ([cause]: ConnectTimeoutError: Connect Timeout Error)?

Добрый день, подскажите пожалуйста, есть проект на Next js 14.2.3. С вот такими роутами:
app/(routes)/(catalog)/foo/[...slug]/page.jsx
app/(routes)/(catalog)/bar/[...slug]/page.jsx
app/(routes)/(catalog)/test/[...slug]/page.jsx

Внутри каждого компонента одинаковая логика генерации, но почему-то при npm run build на сервере падают много таких вот ошибок:
TypeError: fetch failed
    at node:internal/deps/undici/undici:12500:13
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Module.w ([MASKED]//.next/server/app/(routes)/(catalog)/foo/[...slug]/page.js:1:7994) {
  digest: '1853411761',
  [cause]: ConnectTimeoutError: Connect Timeout Error
      at onConnectTimeout (node:internal/deps/undici/undici:6621:28)
      at node:internal/deps/undici/undici:6573:50
      at Immediate._onImmediate (node:internal/deps/undici/undici:6605:13)
      at process.processImmediate (node:internal/timers:478:21)
      at process.callbackTrampoline (node:internal/async_hooks:130:17) {
    code: 'UND_ERR_CONNECT_TIMEOUT'
  }
}

Компонент у меня вот такой:
import React, {Suspense} from "react";
import {notFound} from "next/navigation";

export async function generateMetadata({params}) {
  let info = (process.env.NODE_ENV === 'development') ? {cache: 'no-store'} : {};
  if (params.slug) {
    const path = `${process.env.API_URL}/path/${params.slug.join('/')}?type=foo`
    const res = await fetch(path, info)
    if (res.ok) {
      const instance = await res.json()
      return {
        title: instance?.data?.title,
        description: instance?.data?.description,
        robots: {
          index: instance?.data?.index,
          follow: instance?.data?.follow,
        }
      }
    }
  }
  return {
    title: '',
    description: '',
  }
}

export async function generateStaticParams() {
  let result = [];
  let info = (process.env.NODE_ENV === 'development') ? {cache: 'no-store'} : {};
  for (let l = 1; l <= 3; l++) {
    const path = `${process.env.API_URL}/path/l/${l}`
    const res = await fetch(path, info)
    const items = await res.json()
    let r = items.map(elem => {
      return {
        slug: elem.url.split("/")
      }
    })
    result = [...result, ...r]
  }
  return result
}

export default async function Page({params, searchParams}) {
  let items = [];
  let info = (process.env.NODE_ENV === 'development') ? {cache: 'no-store'} : {next: {revalidate: 120}};
  const {slug} = params
  const page = Math.max(1, Number(searchParams?.page ?? 1))
  const res = await fetch(`${process.env.API_URL}/path/s/${slug.join('/')}?type=foo`, info)
  if (!res.ok) {
    return notFound();
  }
  const instance = await res.json()
  if (instance?.data) {
    const resEx = await fetch(buildUrl(instance?.data, {page}), {next: {revalidate: 120}})
    if (!resEx.ok) {
      return notFound();
    }
    items = await resEx.json()
  }
  return (
    <>
      ...
    </>);
}

fetch делает запросы к бэкенд сервису, я в логах php-fpm видел что он в момент билда пытается увеличить pm.max_children setting возможно не хватает на сервер ресурсов ?
  • Вопрос задан
  • 350 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы