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

NextJS 13.2.1中getServerSideProps返回的Next-Auth Session为undefined问题

问题原因及解决办法

核心原因分析

1. Session对象包含不可序列化内容

Next.js 在传递 getServerSideProps 返回的 props 到客户端时,必须先将 props 序列化为 JSON 格式。如果完整的 Session 对象里包含**函数、Symbol、循环引用、特殊类型对象(如未处理的Date)**这类无法被 JSON 序列化的内容,整个对象会在序列化过程中失效,最终客户端拿到的就是 undefined。而 session.user 是纯基础类型组成的普通对象,不存在序列化障碍,所以能正常传递。

2. 类型定义与实际对象不匹配

你导入的 Session 类型可能和 getServerSession 实际返回的对象结构存在差异——比如实际返回的 session 包含类型定义之外的非标准属性,或者类型中的某些属性在序列化时被过滤,导致客户端通过类型约束接收时出现兼容性问题,表现为 undefined。而传递 user 时用了 any 类型跳过了类型检查,所以能正常读取内容。

3. Next.js 13.2.1 版本特定bug

这个版本的 Next.js 在处理复杂对象序列化时可能存在已知问题,session 对象结构比 user 更复杂,刚好触发了该bug,而 user 因为结构简单不受影响。

验证与解决办法

验证方法

在 getServerSideProps 里手动序列化 session,检查是否会丢失数据:

export const getServerSideProps: GetServerSideProps = async (context) => {
  const session = await getServerSession(context.req, context.res, authOptions);
  if (!session) {
    return { redirect: { destination: redirectUrl, permanent: false } };
  }
  // 手动序列化测试
  const testSession = JSON.parse(JSON.stringify(session));
  console.log('序列化后的session:', testSession); // 如果输出undefined或缺失属性,说明存在不可序列化内容
  return { props: { session } };
};

解决办法

  1. 按需传递属性:像你现在这样只传递需要的 session.user 或其他必要字段,避免传递整个复杂的 session 对象。
  2. 手动处理序列化:在 getServerSideProps 里过滤掉 session 中不可序列化的属性,比如:
return {
  props: {
    session: {
      user: session.user,
      expires: session.expires // 仅保留可序列化的字段
    }
  }
};
  1. 升级依赖版本:尝试升级 Next.js 到 13.x 的后续稳定版本,或者升级 NextAuth 到最新版本,修复可能存在的序列化bug。
  2. 检查 NextAuth 配置:在 authOptions 的 session 回调中,确保返回的 session 结构只包含可序列化的字段,避免添加函数或特殊类型的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:47:29