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
相关产品推荐
相关产品推荐

