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

NextJS中如何从Session获取用户信息到getServerSideProps()?

解决NextJS中NextAuth Session获取及Protected页面数据查询问题

核心问题修复

你当前的主要问题是getServerSession调用缺少req和res参数,这两个参数来自getServerSideProps自动传入的context对象——该对象无需额外导入,NextJS执行服务器端渲染时会自动传递给getServerSideProps函数。

修复后的完整代码

import SignOut from "@/components/sign-out";
import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
import React from "react";
import { InferGetServerSidePropsType, GetServerSidePropsContext } from "next";
import prisma from "@/lib/prisma";
import { Member, Tribe, User } from "@prisma/client";
import { authOptions } from 'pages/api/auth/[...nextauth]';
import { getServerSession } from 'next-auth/next';

type Victor = User & { members: (Member & { tribe: Tribe })[] };

export async function getServerSideProps(context: GetServerSidePropsContext) {
  // 正确传入请求上下文与auth配置获取session
  const ses = await getServerSession(context.req, context.res, authOptions);

  // 未登录时直接重定向到登录页,保护页面权限
  if (!ses) {
    return {
      redirect: {
        destination: '/api/auth/signin',
        permanent: false,
      },
    };
  }

  // 利用session中的用户邮箱查询完整数据
  const victor = await prisma.user.findFirst({
    include: {
      members: {
        include: {
          tribe: true,
        },
      },
    },
    where: {
      email: ses.user.email,
    },
  });

  return { props: { victor } };
}

export default function Home({
  victor,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
  return (
    <pre>{JSON.stringify(victor, null, 2)}</pre>
  );
};

关键修改说明

  • 传入context参数:context包含HTTP请求/响应对象(类比PHP中的$_REQUEST、响应实例),是getServerSession读取cookie中会话标识的必要条件。
  • 添加权限拦截:作为受保护页面,必须处理未登录场景,避免无效数据查询。
  • 简化查询逻辑:通过前置的if (!ses)判断,确保ses.user.email必然存在,无需多层可选链判断。

确保NextAuth Session包含用户邮箱

若仍无法获取ses.user.email,需检查pages/api/auth/[...nextauth].ts中的authOptions配置,确保会话回调正确返回用户信息:

import { NextAuthOptions } from "next-auth";

export const authOptions: NextAuthOptions = {
  session: {
    strategy: "jwt", // 或database策略,根据你的登录方式选择
  },
  providers: [
    // 你的登录提供者配置(如Google、Credentials等)
  ],
  callbacks: {
    async jwt({ token, user }) {
      if (user) token.email = user.email;
      return token;
    },
    async session({ session, token }) {
      session.user.email = token.email;
      return session;
    },
  },
};

针对PHP背景的概念补充

从PHP框架转至NextJS,可将getServerSideProps类比为Symfony的控制器动作:

  • 运行在服务器端,负责处理请求、获取数据,再将数据作为props传递给页面组件(类比PHP控制器向Twig模板传参)。
  • NextAuth的Session机制类似PHP会话(如Symfony Session组件),通过cookie存储会话标识,服务器端据此获取用户信息,无需手动在URL中传递用户ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:37:16