NextJS14中NextAuth会话销毁及TypeScript类型错误求助
修复TypeScript类型错误(错误代码2322)
问题根源在于session回调返回null违反了TypeScript类型约束——NextAuth的session回调要求返回Session | DefaultSession类型,不允许返回null。正确做法是抛出错误标记会话过期,而非返回null,这样NextAuth会自动触发登出流程并跳转至登录页。
修改你的session回调代码:
async session({ token, session }) { session.user.name = token.userInfo.nameSurname; session.user.email = token.userInfo.email; session.user.userName = token.userInfo.userName; session.accessToken = token.accessToken; session.expiration = new Date(token.expiration).toISOString(); session.expires = new Date(token.expiration).toISOString(); const currentDate = new Date(); const expirationDate = new Date(token.expiration); if (currentDate < expirationDate) { console.log('会话有效'); return session; } else { console.log('会话过期'); // 抛出错误触发自动登出 throw new Error('Session expired'); } }
在NextJS14中销毁NextAuth会话
销毁会话分两种场景处理:
1. 客户端主动销毁会话
直接使用next-auth/react提供的signOut函数,可在任意客户端组件中调用:
import { signOut } from 'next-auth/react'; // 示例:点击按钮触发登出 const handleSignOut = () => { signOut({ redirect: true, callbackUrl: '/Login' // 登出后跳转的目标页面 }); };
2. 服务端销毁会话
在API路由或服务器组件中,使用next-auth/next/server的signOut函数:
import { signOut } from 'next-auth/next/server'; import { authOptions } from './[...nextauth]/route'; // 导入你的认证配置 export async function POST(request: Request) { // 执行登出并跳转 return signOut({ redirect: true, callbackUrl: '/Login', authOptions // 传入自定义的认证配置 }); }
额外提示
- 若希望会话过期时自动刷新token而非直接登出,可在
jwt回调中调用后端的刷新token接口,更新token的有效期和accessToken字段。 - 确保
next-auth.d.ts中的类型声明完全覆盖自定义字段,避免其他潜在类型错误。
内容的提问来源于stack exchange,提问作者Kubilay
相关产品推荐
相关产品推荐

