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
相关产品推荐
相关产品推荐

