Next-Auth Google登录:注销/会话过期后重登报account未定义错误
解决Next-Auth谷歌登录注销后再次登录报错的问题
针对你遇到的首次登录正常,注销/会话过期后再登录抛出Cannot read properties of undefined (reading 'account')错误,重启dev服务恢复的问题,以下是排查和解决方向:
1. 修复Prisma客户端单例问题
Next.js热重载时会重复创建PrismaClient实例,导致数据库连接异常,进而查询Account数据时出错。确保Prisma客户端是单例模式:
创建lib/prisma.ts:
import { PrismaClient } from '@prisma/client' const prisma = global.prisma || new PrismaClient() if (process.env.NODE_ENV !== 'production') global.prisma = prisma export default prisma
之后在authOptions中统一使用这个单例实例,不要每次新建。
2. 检查PrismaAdapter配置
确保authOptions中正确使用NextAuth的Prisma适配器,且传入的是单例Prisma客户端:
// lib/nextAuth.ts import { NextAuthOptions } from 'next-auth' import GoogleProvider from 'next-auth/providers/google' import { PrismaAdapter } from '@next-auth/prisma-adapter' import prisma from './prisma' export const authOptions: NextAuthOptions = { adapter: PrismaAdapter(prisma), providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID!, clientSecret: process.env.GOOGLE_CLIENT_SECRET! }) ], // 其他配置(比如session策略、callbacks等) }
3. 排查自定义回调中的account引用错误
如果在authOptions的callbacks中自定义了signIn或其他回调,确保先判断account是否存在再访问其属性:
callbacks: { async signIn({ user, account, profile }) { // 错误写法:直接访问account.provider,未判断account是否为undefined // if (account.provider === 'google') { ... } // 正确写法:使用可选链判断 if (account?.provider === 'google') { // 你的自定义逻辑 } return true } }
4. 确保数据库唯一性约束生效
执行npx prisma migrate dev,确保Account表的provider和providerAccountId联合唯一约束已正确应用到PostgreSQL中。如果约束缺失,可能导致重复创建Account记录,引发查询异常。
5. 强制Auth路由动态处理
在app/api/auth/[...nextauth]/route.ts中添加动态配置,避免路由被静态缓存:
import NextAuth from "next-auth/next"; import { authOptions } from "@/lib/nextAuth"; export const dynamic = 'force-dynamic' // 必须添加,确保每次请求动态处理 const handler = NextAuth(authOptions); export { handler as GET, handler as POST };
内容的提问来源于stack exchange,提问作者Vaikruta
相关产品推荐
相关产品推荐

