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

NextJs用NextAuth保护API时getServerSideProps/getStaticProps调用返回null问题

问题根因

getSession 依赖请求头中的Cookie识别用户会话:

  • 前端组件内调用接口时,浏览器会自动携带当前站点的所有认证Cookie,所以getSession可以正常返回数据
  • getStaticProps/getServerSideProps 是服务端运行的方法,你在其中发起的fetch请求是服务端侧主动发起的,默认不会携带用户浏览器的Cookie,所以API接口的getSession无法识别到用户,返回null
  • 额外补充:getStaticProps是构建/增量静态再生阶段运行的,本身就不存在当前访问用户的请求上下文,天生不适合请求用户专属的鉴权数据
解决方案

根据你的渲染场景选择对应方案:

场景1:使用getServerSideProps(每次请求动态渲染)

推荐优先选方案1,减少不必要的内部请求开销:

  • 方案1:直接在getServerSideProps内获取会话并执行业务逻辑,不调用内部API
import { getSession } from 'next-auth/client';

export async function getServerSideProps(context) {
  const session = await getSession(context);
  // 未登录直接跳转登录页
  if (!session) {
    return {
      redirect: {
        destination: '/login',
        permanent: false
      }
    }
  }
  // 直接复用业务逻辑获取数据,不需要调用自己的API接口
  const projectService = new ProjectService();
  const projects = await projectService.getUserProjects(session.user.email);

  return {
    props: { projects },
  };
}
  • 方案2:如果必须调用内部API,发起请求时手动携带用户Cookie
export async function getServerSideProps(context) {
  const projects = await fetchApi(`${process.env.BASE_URL}/projects`, {
    headers: {
      Cookie: context.req.headers.cookie || ''
    }
  });

  return {
    props: { projects },
  };
}

场景2:原本使用getStaticProps

getStaticProps本身不支持获取当前用户的专属动态数据,直接将getStaticProps改为getServerSideProps走服务端渲染逻辑,或者将接口请求逻辑迁移到前端组件内部执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:18:05