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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:47:28