NodeJS 在部署于Vercel上的Nextjs中,API请求出现504/502错误

yh2wf1be  于 2023-03-08  发布在  Node.js
关注(0)|答案(6)|浏览(242)

我在Next.js中开发了一个应用程序。对于后端,我使用了Nextjs中配置的API端点,它们位于pages/api中。api端点经常返回502(网关超时错误)或504(我们的部署有问题)。
通过一些研究,我发现这是因为服务器超时而发生的。对于我部署了NextJS应用程序的Vercel,无服务器函数的最大超时周期是10s。
其中一个端点(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(不是无服务器)这样的东西还是什么?
我为一个客户做了这个网站,现在我不知道是什么问题导致了这个。

jvlzgdj9

jvlzgdj91#

首先尝试隔离问题的根源,这样您就知道下一步要采取什么步骤。
例如,尝试在不使用或不连接到DB的情况下返回一些伪数据。

export default async function handler(req, res) {

    console.log('Entered the serverless function')

    return { "dummy": "data"}
}

如果您仍然有超时问题,您现在知道这可能是因为您的Vercel NextJS设置。
如果NextJS设置不是问题所在,那么您就知道问题是由数据库引起的,问题要么出在查询本身,要么出在连接上。
我不确定您使用的是什么DB(从语法上我假设它是MongoDB)。
最可能的解决方案:

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

如果这些方法不起作用,请尝试以下方法:

  • 你的数据库是如何托管的?它是由Vercel管理的吗?尝试使用另一个管理器来查看这是否是问题所在。
  • Vercel Jmeter 板中的所有设置是否都正确?请确保您有正确的MongoDB连接字符串,并且MongoDB示例已设置为接受来自应用的连接。
42fyovps

42fyovps2#

将Vercel与Hobby plan配合使用时,只能为5 seconds处理无服务器API路由。这意味着5秒后,路由将响应504 GATEWAY TIMEOUT错误。
要解决这个问题,您需要缩短API路线响应所需的时间,或升级Vercel方案。

a7qyws3x

a7qyws3x3#

经过不断的研究,我在Heroku上发布了API,在Vercel上发布了前端。我在一个stackoverflow帖子中读到了这个建议,这个帖子来自一个家伙,他说他在Vercel工作,这是最合适的解决方案。
我认为这是无服务器架构本身的问题,我尝试在Netlify上部署Nextjs,也面临类似的情况。

c0vxltue

c0vxltue4#

我也面临着同样的问题
任务在10.01秒后超时
与Next.js API端点连接到MongoDB(atlas)。对我来说,根本原因实际上是MongoDB中的网络访问被设置为我自己的IP地址,因此不允许从我部署的应用程序。对于那些面临与Next.js函数相同问题的人,还请检查MongoDB是否正确配置为接受来自IP地址而不是您自己的IP的连接。
上下文见下文:
注意:Vercel使用动态IP地址,因此您需要在MongoDB Atlas Jmeter 板中添加一个例外,以便从任何IP地址进行访问。要执行此操作,请简化导航到网络访问选项卡,点击添加IP地址按钮,然后点击允许从任何地方访问按钮,或在访问列表条目中输入0.0.0/0。

a14dhokn

a14dhokn5#

我也遇到了这个问题,并设法解决了它。
我在我的页面组件中使用了getStaticProps&getStaticPaths,它在开发中运行良好,但当我尝试在生产中部署时,出现了无效的json响应主体错误。
原来getStaticProps&getStaticPaths函数没有建立到我的MongoDB的连接,因此返回undefined导致应用崩溃

    • 解决方案:**

我通过直接连接到我的MongoDB并从getStaticProps&getStaticPaths函数中执行DB调用修复了这个问题。
希望这能帮到什么人。

fbcarpbf

fbcarpbf6#

我也遇到过同样的问题,这是由next-auth引起的(在我的例子中)。所以这个问题是4.15.0版本的问题。我把next-auth版本设置为4.15.0,它为我解决了这个问题。希望它能为某人保存一些时间。

相关问题