在 Vercel 上部署的 Nextjs 中的 api 请求出现 504/502 错误

时间:2021-05-09 11:04:28

标签: node.js lambda next.js serverless vercel

我在 Next.js 中开发了一个应用程序。对于后端,我使用了 Nextjs 中配置的 api 端点,这些端点位于 pages/api 内。 api 端点经常返回 502(网关超时错误)或 504(我们的部署有问题)。

通过一些研究,我发现这是因为服务器超时。对于我部署 Nextjs 应用程序的 Vercel,无服务器功能的最大超时时间为 10 秒。

端点之一(https://bulkbays.com/api/fetchSections)的代码是

import db from "../../config/db";
import Section from "../../Models/Section";

db();

export default async function handler(req, res) {

    console.log('Entered the serverless function')

    Section.find()
        .lean()
        .then((sections) => {
            console.log('Fetched Sections',sections)
            return res.json(sections);
        })
        .catch((err) => {
            console.log('Error in fetching sessions',err)
            return res.json({
                status: false,
                msg: "An unexpected problem occured",
                err,
            });
        });
}

请有人告诉我怎么可能需要超过 10 秒。它是人们可以进行的最简单的查询。此外,此查询的结果只是一个长度为 9 的数组,对象作为项目,其值是字符串。看起来像这样

[
  {
  "_id":"6092a55478ccc2092c5e41b0",
  "images":["http://res.cloudinary.com/bulkbays97/image/upload/v1620223428/eysvsch2hf4ymajizzcn.jpg","http://res.cloudinary.com/bulkbays97/image/upload/v1620223429/qiwa2idfrntiygsfmnx2.jpg","http://res.cloudinary.com/bulkbays97/image/upload/v1620223429/elwhjk7abwcde7ccqcxf.jpg","http://res.cloudinary.com/bulkbays97/image/upload/v1620223428/yuzhe8iehcyj1rmfyr09.jpg"],
  "title":"P-Caps",
  "createdAt":"2021-05-05T14:01:56.626Z",
  "updatedAt":"2021-05-05T14:01:56.626Z","__v":0
  },
  ....
]

这是发送 502 或 504 响应的请求之一的日志

[GET] /api/fetchSections
14:36:34:38
Status:-1
Duration:10010.32 ms
Init Duration: N/A
Memory Used:60 MB
ID:x7lh8-1620552994128-a44f049a01ae
User Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0
2021-05-09T09:36:44.511Z 62c16977-9c5c-42f5-961f-a63083638a9c Task timed out after 10.01 seconds

请在这方面指导我。我应该怎么办?我应该为此使用 Heroku(不是无服务器)之类的东西还是什么?

我为一个客户制作了这个网站,现在我不知道是什么问题导致了这个问题。

2 个答案:

答案 0 :(得分:1)

首先尝试隔离问题的根源,以便您知道接下来要采取的步骤。

例如,尝试在不使用或连接到数据库的情况下返回一些虚拟数据。


export default async function handler(req, res) {

    console.log('Entered the serverless function')

    return { "dummy": "data"}
}

如果您仍然遇到超时问题,您现在知道这可能是因为您的 Vercel NextJS 设置。

如果您的 NextJS 设置不是问题,那么您就知道问题是由您的数据库引起的。问题要么出在查询本身,要么出在连接上。

我不确定您使用的是什么数据库(从语法上我假设它是 MongoDB)。

最可能的解决方案:

  • 目前还不清楚 db() 的作用或它是什么。我假设它处理与 MongoDB 实例的连接。无论哪种方式,请确保检查 db() 函数是否是异步的。这是一个常见的错误;如果函数是异步的并且您没有正确调用它,那么超时可能是由这个异步问题引起的。
  • 您是为每个请求创建新连接还是重复使用现有的打开连接?每次都创建一个新的连接可能会很昂贵;这可能是导致超时问题的原因。

如果这些都不起作用,请尝试以下操作:

  • 您的数据库是如何托管的?是否由 Vercel 管理?尝试使用其他经理,看看问题是否出在那里。
  • 您的 Vercel 仪表板中的所有设置是否正确?确保您拥有正确的 MongoDB 连接字符串,并且您的 MongoDB 实例已设置为接受来自您的应用的连接。

答案 1 :(得分:1)

经过不断研究,我将 API 发布在 Heroku 上,并将前端发布在 Vercel 上。我在一个 stackoverflow 帖子中读到了这个建议,他说他在 Vercel 工作过,这是最合适的解决方案。

我认为这是无服务器架构本身的问题。我尝试在 netlify 上部署 Nextjs 并遇到了类似的情况。