Next.js 13 App目录下服务端组件如何获取getServerSession?
解决Next.js 13 App目录下服务端组件获取serverSession的问题
核心思路是把authOptions从API路由中抽离成独立的可导出配置文件,这样服务端组件和API路由都能复用这个配置。
步骤1:创建独立的auth配置文件
在app/lib目录下新建auth.ts(JavaScript项目用auth.js),定义并导出你的authOptions:
import { NextAuthOptions } from "next-auth"; import GoogleProvider from "next-auth/providers/google"; // 根据需求导入其他登录提供商 export const authOptions: NextAuthOptions = { providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID!, clientSecret: process.env.GOOGLE_CLIENT_SECRET!, }), // 添加其他提供商配置 ], // 可按需添加session策略、回调函数等其他配置 };
步骤2:更新API路由文件
修改app/api/auth/[...nextauth]/route.ts,导入刚才的authOptions并传给NextAuth:
import NextAuth from "next-auth"; import { authOptions } from "@/app/lib/auth"; const handler = NextAuth(authOptions); export { handler as GET, handler as POST };
注:如果你的项目没配置路径别名
@,可以用相对路径导入,比如../../lib/auth
步骤3:在服务端组件中获取session
现在就可以在服务端组件里导入authOptions,调用getServerSession获取会话了:
import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/lib/auth"; export default async function YourServerComponent() { const session = await getServerSession(authOptions); return ( <div> {session ? ( <pre>{JSON.stringify(session, null, 2)}</pre> ) : ( <p>未登录</p> )} </div> ); }
这样就解决了API路由中没有导出authOptions导致服务端组件无法获取的问题,同时实现了配置的复用,避免重复代码。
内容的提问来源于stack exchange,提问作者Niv
相关产品推荐
相关产品推荐

