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

Next.js13中API路由获取Cookies为空的问题求助

问题解决:Next.js 13 API路由获取Cookies为Null的问题

问题原因

你的ProfilePage是服务器组件,其中的getData函数在服务器端执行。服务器端发起的fetch请求默认不会自动携带当前请求的Cookies到API路由,而浏览器直接调用API时是客户端请求,会自动带上Cookie,因此出现两种调用方式的结果差异。

解决方案

方案一:直接在服务器组件中处理逻辑(推荐)

既然已经能在服务器组件里通过cookies()拿到token,没必要额外调用API,直接在这里处理数据库查询等业务逻辑即可:

// src/app/profile/page.jsx
import UserDetails from "@/components/UserDetails";
import { cookies } from "next/headers";
import { connectDB } from "@/dbConfig/dbConfig";
// 引入你的用户模型
import User from "@/models/userModel";

connectDB();

async function ProfilePage() {
  const cookieStore = cookies();
  const token = cookieStore.get("token");
  
  let userData = null;
  try {
    // 直接用token查询用户数据,无需调用API(示例逻辑,根据实际业务调整)
    userData = await User.findOne({ token: token.value });
  } catch (error) {
    console.log("Error loading user data", error);
  }

  return (
    <div className="flex flex-col justify-center items-center min-h-screen">
      <h1 className="font-bold text-3xl">Profile page</h1>
      <p className="text-gray-600">This is the profile page</p>
      <UserDetails user={userData} />
    </div>
  );
}

export default ProfilePage;

方案二:若必须调用API路由

修改fetch配置,添加credentials: 'include'(同域名下也可用'same-origin'),让服务器端fetch携带当前请求的Cookies:

// src/app/profile/page.jsx 中的getData函数
async function getData() {
  const cookieStore = cookies();
  const token = cookieStore.get("token");
  try {
    console.log(token.value);
    const res = await fetch(`http://localhost:3000/api/users/me`, {
      credentials: 'include', // 关键配置:携带Cookies
    });
    if (!res.ok) {
      throw new Error("Failed to fetch data, please try another time");
    }

    return res.json();
  } catch (error) {
    console.log("Error loading topic", error);
  }
}

另外,你之前尝试通过userToken请求头传递token的方式也可行,但需要在API路由里读取请求头而非Cookies:

// src/api/users/me/route.js
export async function GET(request) {
  try {
    // 读取请求头中的token
    const token = request.headers.get('userToken');
    console.log("Token is: ", token);
    return NextResponse.json({ msg: "success" }, { status: 200 });
  } catch (error) {
    return NextResponse.json(
      { msg: "can't get data", err: error.message },
      { status: 500 }
    );
  }
}

额外说明

  • Next.js 13的App Router中,组件默认是服务器组件,服务器端执行的代码不会自动在fetch中携带Cookies,需显式配置。
  • 如果是客户端组件(添加'use client'指令),fetch默认会自动携带Cookies,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:15:11