NextJS 14中两种API请求方法返回数据差异的原因咨询
我在NextJS 14中调用第三方API,现有两段均可运行但返回结果存在差异的代码:
方法1(/api目录下的路由处理器)
export async function GET() { const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/Client/GetAll`, { headers: { Authorization: `Bearer ${process.env.NEXT_PUBLIC_API_TOKEN}`, }, }); const data = await res.json(); return NextResponse.json({ data }); }
方法2(包含try/catch块)
const headers = new Headers(); headers.append('Authorization', `Bearer ${process.env.NEXT_PUBLIC_API_TOKEN}`); export async function GET() { try { const url = `${process.env.NEXT_PUBLIC_API_URL}/Client/GetAll`; const response = await fetch(url, { method: 'GET', headers: headers, }); if (!response.ok) { throw new Error('Network response was not ok'); } const data = await response.json(); return NextResponse.json({ data }); } catch (error) { throw error; // Rethrow the error to handle it in the calling component } }
最终结果显示,方法2返回了我所需的完整JSON数据,而方法1仅返回约一半的数据。原本期望方法1能返回与方法2相同的API数据,但实际返回数据少于预期,请问这是什么原因?
原因分析
1. Next.js默认缓存机制导致旧数据复用
NextJS 14中,fetch默认采用force-cache策略。如果方法1之前请求过该第三方API,且当时返回的是部分数据,后续调用会直接复用缓存的旧结果;而方法2的代码结构(比如单独创建Headers实例)改变了请求的缓存标识,触发了全新的请求,从而拿到了完整的最新数据。
你可以给方法1的fetch添加cache: 'no-store'参数验证这个猜想:
export async function GET() { const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/Client/GetAll`, { headers: { Authorization: `Bearer ${process.env.NEXT_PUBLIC_API_TOKEN}`, }, cache: 'no-store' // 禁用缓存,强制每次请求最新数据 }); const data = await res.json(); return NextResponse.json({ data }); }
2. 缺少响应状态检查导致部分数据返回
方法1没有检查res.ok状态,如果第三方API返回了206 Partial Content(代表仅返回部分内容)这类非标准成功状态码,方法1会直接解析这部分数据并返回;而方法2虽然也会处理206(因为206属于2xx范围,response.ok为true),但如果是其他错误状态码会抛出错误,避免返回不完整数据——不过结合你描述的方法2返回完整数据的情况,这个可能性低于缓存问题。
3. 请求头解析的隐式差异
虽然理论上直接传递headers字面量和使用Headers实例效果一致,但部分第三方API的服务器对请求头的解析逻辑可能存在差异:比如对Authorization头的格式校验更严格,或者要求必须通过Headers实例设置头信息才会返回完整数据。你可以尝试把方法1的headers改成Headers实例,看是否能拿到完整数据。
内容的提问来源于stack exchange,提问作者jtseng

