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

NextJS 14中use client组件openapi-fetch请求Headers为空问题求助

问题原因

你遇到的空请求头问题,核心是client初始化时只调用了一次getHeaders():Next.js 14的客户端组件仍会经历服务端预渲染流程,此时window不存在,getHeaders()返回空对象;后续即使客户端sessionStorage已有令牌,这个初始的空headers也不会自动更新,导致部分请求不带令牌。

优化实现方案

直接让createClient的headers参数接收一个动态函数,这样每次发起请求时都会重新读取sessionStorage中的令牌,彻底避免静态值带来的问题。同时因为是"use client"组件,请求只会在客户端实际发起,可简化window判断:

"use client";
import { paths } from "../../types/generated-types";
import createClient from "openapi-fetch";

const baseUrl = process.env.NEXT_PUBLIC_API_URL;

// 每次请求时动态读取令牌生成headers
const getHeaders = () => {
  const sesToken = sessionStorage.getItem("acce") || "";
  const idToken = sessionStorage.getItem("token") || "";
  const refreshToken = sessionStorage.getItem("token") || "";

  return {
    accessToken: sesToken,
    refreshToken: refreshToken,
    idToken: idToken,
  };
};

// 关键:headers传入函数,而非静态对象,每次请求都会自动调用该函数
const client = createClient<paths>({ 
  baseUrl, 
  headers: getHeaders
});

export const GET = client.GET;
export const PUT = client.PUT;
export const POST = client.POST;
export const PATCH = client.PATCH;
export const DELETE = client.DELETE;
额外建议
  • 如果令牌会在组件生命周期内更新(比如登录/登出操作),上述方案能自动获取最新值,无需额外处理。
  • 若需要更精细的状态同步,可以结合useState和useEffect监听sessionStorage的变化,但对于绝大多数场景,动态函数的方式已经足够简洁高效。

内容的提问来源于stack exchange,提问作者KeoooDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:51:23