使用Prisma Adapter+NextAuth谷歌登录注册用户报错求助
解决Prisma Adapter + NextAuth谷歌登录时的PrismaClientValidationError问题
问题概述
使用Prisma Adapter搭配NextAuth及谷歌登录提供商,向MongoDB注册新用户时触发PrismaClientValidationError,错误信息显示调用prisma.account.findUnique()时传入了未知参数provider_providerAccountId,系统建议使用providerId_providerAccountId。
解决方案
1. 修正Prisma Schema的Account模型字段(核心修复)
NextAuth的Prisma Adapter默认期望Account模型使用provider字段而非providerType,且联合唯一约束需匹配Adapter的查询逻辑。修改你的Account模型如下:
model Account { id String @id @default(auto()) @map("_id") @db.ObjectId provider String // 替换原providerType字段为provider providerId String providerAccountId String refreshToken String? accessToken String? accessTokenExpires DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userId String @db.ObjectId user User @relation(fields: [userId], references: [id]) @@unique([provider, providerAccountId]) // 调整联合唯一约束为provider + providerAccountId }
原因:Adapter在查询用户第三方账号时,会默认以provider和providerAccountId作为联合查询条件,原Schema中的providerType字段导致Adapter生成了错误的查询参数provider_providerAccountId。
2. 同步数据库并更新Prisma Client
修改Schema后,执行以下命令确保数据库结构与Prisma Client定义一致:
npx prisma generate npx prisma db push
3. 验证版本兼容性(可选)
确保next-auth与@next-auth/prisma-adapter版本匹配,避免因版本差异导致的字段不兼容问题。可以查看项目package.json中的版本号,若存在大版本差异,建议升级到最新兼容版本。
4. 简化配置排查(可选)
若问题仍存在,暂时注释自定义JWT配置,排除自定义逻辑的干扰:
export const authOptions = { secret: process.env.NEXTAUTH_SECRET, providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], adapter: PrismaAdapter(prisma), // 暂时注释自定义JWT配置,先验证基础流程 // jwt: { // async encode({ secret, token }) { // return jwt.sign(token, secret); // }, // async decode({ secret, token }) { // return jwt.verify(token, secret); // }, // }, };
验证
完成上述操作后,重启Next.js应用,尝试通过谷歌登录注册新用户,检查是否仍出现参数错误。
内容的提问来源于stack exchange,提问作者Vraj
相关产品推荐
相关产品推荐

