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

NextJS 14中两种API请求方法返回数据差异的原因咨询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:50:36