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

NextJS 13中使用NextAuth无法获取自定义progress参数求助

在NextJS 13 + NextAuth中添加动态更新的progress字段到会话

一、关于通过API更新数据库的方式是否正确

完全可行且合理,只要你的API Route做好权限校验即可:

  • 用getServerSession校验用户是否登录
  • 仅允许用户更新自己的progress(通过会话中的email/userId匹配数据库文档)

示例PUT API Route代码:

import { getServerSession } from "next-auth/next";
import { authOptions } from "./auth/[...nextauth]";
import { connectToDB } from "../../lib/mongodb";
import User from "../../models/User";

export default async function handler(req, res) {
  if (req.method !== "PUT") return res.status(405).json({ message: "Method not allowed" });

  const session = await getServerSession(req, res, authOptions);
  if (!session) return res.status(401).json({ message: "Unauthorized" });

  const { progress } = req.body;
  await connectToDB();

  try {
    await User.findOneAndUpdate(
      { email: session.user.email },
      { $set: { progress } },
      { new: true }
    );
    res.status(200).json({ message: "Progress updated" });
  } catch (err) {
    res.status(500).json({ message: "Update failed", error: err.message });
  }
}

二、让会话返回progress字段的方法

NextAuth默认会话只返回name/email/picture,需要通过自定义session(或结合jwt)回调扩展会话数据,两种方案可选:

方案1:实时从数据库拉取最新progress(推荐,实时性高)

每次前端获取会话时,直接从数据库查询当前用户的最新progress并添加到会话中,修改[...nextauth].js/ts:

import NextAuth from "next-auth";
import { connectToDB } from "../../lib/mongodb";
import User from "../../models/User";
// 导入你的认证提供者,比如CredentialsProvider/GitHub等

export default NextAuth({
  providers: [/* 你的认证提供者配置 */],
  callbacks: {
    async session({ session }) {
      await connectToDB();
      const user = await User.findOne({ email: session.user.email });
      if (user) session.user.progress = user.progress;
      return session;
    },
  },
});

优点:API更新数据库后,下次获取会话就能拿到最新值;缺点:每次会话请求都会触发数据库查询,有轻微性能开销。

方案2:将progress存入JWT(性能优,但需手动同步)

把progress存入JWT,减少数据库查询,但更新数据库后需要手动刷新JWT才能同步会话数据:

export default NextAuth({
  providers: [/* 你的认证提供者配置 */],
  callbacks: {
    async jwt({ token }) {
      await connectToDB();
      const user = await User.findOne({ email: token.email });
      if (user) token.progress = user.progress;
      return token;
    },
    async session({ session, token }) {
      session.user.progress = token.progress;
      return session;
    },
  },
});

同步方式:在API更新数据库后,前端调用updateSession(从next-auth/react导入)触发JWT更新,或者让用户重新登录。


内容的提问来源于stack exchange,提问作者JohnPix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:45:37