在Vercel部署Next.js App Router+Ably时遇40104/40105错误
解决Vercel部署Next.js Ably Token路由的40104/40105错误
修复代码
在你的API路由文件中添加dynamic: "force-dynamic"配置,确保每次请求都生成全新的Token请求:
// src/app/api/getAblyToken/route.ts import { NextResponse } from "next/server"; import ably from "ably/promises"; export const fetchCache = "force-no-store"; export const dynamic = "force-dynamic"; // 强制路由动态执行 export async function GET() { const token = await new ably.Rest({ queryTime: true, key: process.env["ABLY_API_KEY"]!, }).auth.createTokenRequest({ capability: { "*": ["subscribe", "publish", "presence"], }, }); console.log(token); return NextResponse.json(token); }
错误原因解析
40104(Token已被使用):Vercel默认会静态化App Router的API路由,即使设置了
fetchCache,仍可能缓存Token请求的响应结果。当多个客户端复用同一个缓存的Token请求时,Ably会判定该Token已被使用,返回40104错误。dynamic: "force-dynamic"强制路由每次请求都重新执行服务器端逻辑,生成全新的Token请求,避免重复使用。40105(时间戳无效):Vercel边缘运行环境的系统时间可能与Ably服务器存在偏差,
queryTime: true会让Ably客户端向服务器获取准确时间来生成Token请求的时间戳。如果路由被静态化缓存,这个时间戳不会更新,很快就会过期,触发40105错误。强制动态路由后,每次请求都会重新获取最新的服务器时间,保证时间戳有效。
内容的提问来源于stack exchange,提问作者Noam
相关产品推荐
相关产品推荐

