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

Posted

技术标签:

【中文标题】在 Vercel 上部署的 Nextjs 中的 api 请求出现 504/502 错误【英文标题】:Getting a 504/502 error on api requests in Nextjs deployed on Vercel 【发布时间】:2021-07-31 01:30:06 【问题描述】:

我在 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(不是无服务器)之类的东西吗?

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

【问题讨论】:

您介意联系 Vercel 支持吗?请提供以下信息:您使用的是什么类型的数据库?它在哪里托管?什么地区?谢谢! vercel.com/contact @leerob 是的。我确实给他们发了电子邮件。一封电子邮件来自某个技术支持人员,他说我检查了端点并返回了 json 数据,但我告诉他这种超时事情不会每次都发生,但有时会发生。从那以后没有回复 @UsmanAbdurRehman:我的猜测是与 mongo 服务器或 mongo 服务器配置的连接错误,尝试将您的数据库移动到某个可靠的位置(例如 mongodb atlas)并检查是否可以解决问题 在来自 Next.js for Mongoose 的 this example 中,他们在 api 处理函数中调用了 db 连接函数。看看这是否适合你。 @cymruu 我已经在地图集上部署了我的数据库。我不知道在哪里部署它大声笑 【参考方案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 实例已设置为接受来自您的应用的连接。

【讨论】:

我正在使用托管在 mongodb atlas 上的 mongodb。我不知道在哪里可以免费部署它。 这是 db 函数。 Nextjs 没有办法在所有端点中保持数据库连接,所以在一篇文章 import * as mongoose from 'mongoose' const connection = ; 中找到了这种方式。异步函数 db() if (connection.isConnected) return; const db = await mongoose.connect(process.env.MONGO_URI, useNewUrlParser: true, useUnifiedTopology: true, ); connection.isConnected = db.connections[0].readyState; 导出默认数据库; 这只是检查是否已经与数据库建立了连接。如果有,则返回。否则它会与数据库建立连接 你为什么不等待db函数建立连接。我的意思是 db 函数返回一个承诺,你应该在处理函数中执行“await db()”,然后运行你的 mongo 查询。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我遇到了同样的问题

任务在 10.01 秒后超时

使用连接到 MongoDB(atlas) 的 Next.js API 端点。对我来说,根本原因实际上是 MongoDB 中的网络访问被设置为我自己的 IP 地址,因此不允许从我部署的应用程序中访问。对于那些在 Next.js 函数中遇到同样问题的人,还请检查 MongoDB 是否已正确配置为接受来自您自己 IP 以外的 IP 地址的连接。

上下文见下文:

注意:Vercel 使用动态 IP 地址,因此您需要添加例外以从 MongoDB Atlas 仪表板中的任何 IP 地址进行访问。为此,只需导航到“网络访问”选项卡,点击“添加 IP 地址”按钮,然后点击“允许从任何地方访问”按钮,或在“访问列表条目”中输入 0.0.0/0。

【讨论】:

顺便说一句,这不是我的问题。如上所述,我为任何 IP 配置了 IP 白名单。它之所以发生是因为 netlify/vercel 的免费层或任何无服务器服务都没有为 API 请求提供大的超时时间,所以如果您正在查询数据库,并且在我的情况下从共享集群查询,这种情况必然会发生.

以上是关于在 Vercel 上部署的 Nextjs 中的 api 请求出现 504/502 错误的主要内容,如果未能解决你的问题,请参考以下文章

NextJS 和 Vercel:网站不呈现/使用 CSS 和 ReactJS

NextJS 部署到 Vercel:找不到 404 页面

Tailwind CSS 样式未应用于 Vercel 上已部署的 NextJs 应用程序

由于 Webpack 错误,nextJS 在 Vercel 上构建失败

NextJS / vercel - 504 错误'FUNCTION_INVOCATION_TIMEOUT'

为啥我的自定义 Nextjs 服务器在我的 Vercel 部署中不起作用?