生产环境中Vercel上getServerSideProps调用Express+MongoDB API超时
问题背景
部署在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

