NextAuth会话更新方法失效问题求助
NextAuth调用update后会话未更新的解决方案
你的问题核心是:JWT回调仅在用户登录时初始化用户数据,后续调用update()时没有同步数据库里的最新用户信息,导致session始终返回旧值。以下是具体解决步骤:
1. 修改[...nextauth].ts的JWT回调
需要在jwt回调中,处理update()触发的token刷新逻辑,从数据库拉取最新用户数据更新token:
callbacks: { async session({ session, token } : any) { session.accessToken = token.accessToken; session.user = token.user; return session; }, async jwt({ token, user, trigger, session }) { // 用户登录时初始化token数据 if (user) { token.accessToken = user.id; token.user = user; } // 调用update()时,从数据库获取最新用户并更新token if (trigger === "update") { // 替换成你实际的数据库查询逻辑 const updatedUser = await UserModel.findById(token.accessToken); token.user = updatedUser; } return token; }, }
当你调用update()时,trigger参数会被设为"update",此时执行数据库查询,把最新用户数据写入token,session回调就会返回更新后的数据。
2. 可选:调用update时直接传入更新数据
如果不想每次都查数据库,可以在调用update()时直接传入最新用户信息:
const submitHandler: SubmitHandler<CompleteOrganisationFormValues> = async (formData:CompleteOrganisationFormValues) => { setLoading(true); try { const { message } = await OrganisationService.completeOrgInfo(formData, activeUser?.id); // 获取更新后的用户数据 const updatedUser = await OrganisationService.getUserById(activeUser?.id); setLoading(false); if (message === "OK") { await update({ user: updatedUser }) toast.success(`Succesfuly!`); setCompleteOrgInfoStatus(true); } } catch (error: any | { type: string; message: string; }) { setLoading(false); console.error(error) if(error?.message) { toast.error(`${error?.message}`); } } }
对应的JWT回调可以简化为:
async jwt({ token, user, trigger, session }) { if (user) { token.accessToken = user.id; token.user = user; } if (trigger === "update" && session?.user) { token.user = session.user; } return token; },
3. 简化useAuth钩子(可选)
你的useAuth钩子中,useEffect里调用getSession是冗余的,useSession的data已经是实时更新的session数据,可以简化:
import { useSession } from 'next-auth/react'; const useAuth = () => { const { data, update } = useSession(); return { ...data, update }; }; export default useAuth;
内容的提问来源于stack exchange,提问作者Eren Emmez
相关产品推荐
相关产品推荐

