NextJS / vercel - 504 错误“FUNCTION_INVOCATION_TIMEOUT”

Lii*_*m93 9 javascript reactjs next.js vercel

部署到 vercel 后,在我的一个页面上出现此错误,在开发模式下一切正常。

我认为问题可能是我的 fetch/API 之一,因为它使用第一个 fetch 请求中的数据作为第二个 fetch 请求的 URL...

我的所有其他具有不同 API/获取请求的页面都工作正常......

export const fetchData = async (page) => {
  try {
    const req = await fetch(
      "https://www.productpage.com/new/" +
        page
    );
    const html = await req.text();
    const $ = cheerio.load(html);

    let newProducts = [];

    for (let i = 1; i < 25; i++) {
      let name = $(`#product_listing > tbody > #_${i} > td:nth-child(2) > a`)
        .text()
        .replace(/\n/g, "");
      let pageSrc = $(
        `#product_listing > tbody > #_${i} > td:nth-child(2) > a`
      ).attr("href");
      const price = $(`#product_listing > tbody >#_${i} > td.price.notranslate`)
        .text()
        .replace(/\n/g, "");

      pageSrc = "https://www.productpage.com" + pageSrc;

      const req2 = await fetch(pageSrc); // here it is using data from first fetch for a 2nd request..
      const html2 = await req2.text();
      const $2 = cheerio.load(html2);

      const imageSrc = $2(
        "#product-main-image .main-image-inner:first-child img"
      ).attr("src");
      const name2 = $2("#product-details dd:nth-child(2)")
        .text()
        .replace(/\n/g, "");
      const brand = $2("#product-details dd:nth-child(4)")
        .text()
        .replace(/\n/g, "");

      newProducts.push({
        name: name,
        name2: name2,
        brand: brand,
        pageSrc: pageSrc,
        price: price,
        imageSrc: imageSrc,
      });
    }

    return newProducts;
  } catch (err) {}
};

module.exports = {
  fetchData,
};
Run Code Online (Sandbox Code Playgroud)

小智 28

此错误表明 API 响应花费的时间太长。

在计划中使用 Vercel 时Hobby,您的无服务器 API 路由只能处理 5 秒。这意味着 5 秒后,路由将响应错误504 GATEWAY TIMEOUT。

当在本地运行时,这些相同的限制不适用next dev。

要解决此问题,您需要减少 API 路由响应所需的时间,或升级您的 Vercel 计划。


Mar*_*vic 5

尝试更改 vercel 上的无服务器函数区域,设置 -> 函数。默认为美国华盛顿,它应该与您的数据库位置相匹配。