如何解决Vercel部署的Next.js应用代理API时的10秒超时问题
解决Vercel部署Next.js API路由代理超时(504/10秒超时)问题
问题根源
Vercel的Serverless Functions(包含Next.js的API路由)默认最大执行时间为10秒,当你代理的第三方API响应耗时超过10秒时,就会触发Task timed out after 10.01 seconds报错并返回504状态码。
可行解决方案
1. 调整Vercel函数超时时长(仅付费计划支持)
Vercel免费计划无法修改超时限制,Pro及以上套餐可将Serverless Functions的最大执行时间调整至60秒。在项目根目录创建或修改vercel.json:
{ "functions": { "pages/api/**/*.js": { "maxDuration": 60 } } }
注意:若第三方API响应时长超过60秒,此方案仍不适用。
2. 切换为Vercel Edge Functions
Edge Functions的超时限制更宽松(免费计划15秒,Pro及以上60秒),且运行在边缘节点,能降低部分网络延迟。将原API路由改为Edge Runtime模式(以App Router为例):
// app/api/proxy/route.js export const runtime = 'edge'; export async function POST(request) { // 服务端获取认证令牌 const authToken = await fetch('你的认证接口') .then(res => res.json()) .then(data => data.token); // 代理请求到第三方API const thirdPartyRes = await fetch('https://第三方API地址', { method: request.method, headers: { 'Authorization': `Bearer ${authToken}`, // 保留原请求必要头信息,排除host等冲突字段 ...Object.fromEntries(request.headers.entries()).filter(([key]) => key !== 'host') }, body: request.body }); return new Response(thirdPartyRes.body, { status: thirdPartyRes.status, headers: thirdPartyRes.headers }); }
3. 异步化处理+前端轮询(需第三方API支持)
如果第三方API支持异步任务模式(提交请求后返回任务ID,后续可查询结果),可拆分流程:
- 第一步:你的API路由仅向第三方提交任务,拿到任务ID后立即返回给前端
- 第二步:前端定时轮询你的API路由,由该路由查询第三方的任务执行状态,直到获取最终结果
这种方式避免了Vercel函数长时间挂起,从根本上规避超时问题。
4. 迁移代理逻辑至外部服务
若第三方API响应时长远超60秒,可将代理逻辑部署到支持更长超时的服务(如AWS Lambda最大支持15分钟),Vercel的API路由仅作为中转调用该外部服务,确保Vercel侧的请求耗时控制在10秒以内。
内容的提问来源于stack exchange,提问作者kunalkeshan
相关产品推荐
相关产品推荐

