You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生产环境中Vercel上getServerSideProps调用Express+MongoDB API超时

问题分析:Next.js getServerSideProps生产环境超时原因

问题背景

部署在AWS Elastic Beanstalk上的Express.js + MongoDB Atlas无服务器API,响应耗时在0.078秒至1.856秒之间。本地环境中getServerSideProps运行正常,但生产环境调用时出现超时错误:

[GET] /articles/637a08a20218e2e3c841e8d7
22:58:07:13
2022-11-20T20:58:17.290Z 881d4090-532d-42df-9ee2-dd759a6eae08 Task timed out after 10.02 seconds

getStaticPaths与getStaticProps运行正常,但需创建约10万条动态路由,不具备可扩展性;列表分页页面已使用SWR,但动态页面使用会影响SEO。

可能的超时原因

1. 跨服务网络延迟叠加

Vercel无服务器函数的边缘节点与你的AWS Elastic Beanstalk部署区域若跨区域,会产生额外网络往返耗时。单次API响应虽在2秒内,但加上Vercel函数的冷启动时间、网络延迟,总耗时容易触达10秒的超时阈值。

2. MongoDB Atlas无服务器实例冷启动

MongoDB Atlas无服务器实例闲置后会休眠,首次请求需唤醒实例,这个过程可能耗时数秒。API响应耗时统计的1.856秒是正常响应时间,若刚好遇到实例唤醒,实际耗时会被拉长,导致Vercel函数超时。

3. 代码变量名错误

查看你的getServerSideProps代码:

// [articleID].tsx
export const getServerSideProps: GetServerSideProps = async (context) => {
  const { article } = context.params;
  const article = await getFetcher(`/articles/${articleID}`);

  if (!article) {
    return {
      notFound: true,
    };
  }

  return {
    props: { article },
  };
};

这里存在变量名不匹配问题:从context.params解构的是article,但请求时使用的是未定义的articleID,会导致请求路径变为/articles/undefined。如果后端未处理这种非法请求,可能陷入无响应状态,最终触发Vercel函数超时。

4. Vercel函数超时阈值限制

Vercel无服务器函数默认超时时间为10秒(日志中的Task timed out after 10.02 seconds也能验证),若API请求加上函数自身处理时间刚好超过这个阈值,就会触发超时。

5. axios未设置超时时间

你的getFetcher函数中使用axios但未配置超时参数,当API因临时网络波动、后端阻塞等原因响应变慢时,axios会一直等待,直到Vercel函数触发超时。

验证与修复建议

  • 修复代码变量错误:将const { article } = context.params;改为const { articleID } = context.params;,确保请求路径正确。
  • 给axios添加超时配置:
    const config = { 
      headers,
      timeout: 8000 // 设置为小于Vercel超时的时间,比如8秒
    };
    
  • 优化MongoDB Atlas策略:若成本允许,调整实例为保持活跃状态;或在Express API层增加缓存,减少对Atlas的直接请求。
  • 统一部署区域:将Express API部署到与Vercel同区域的AWS服务,降低跨区域网络延迟。

内容的提问来源于stack exchange,提问作者axelmukwena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:45:32