NextAuth搭配GitHub与Prisma时providerId_providerAccountId参数报错如何解决
问题原因
你遇到的报错是**@next-auth/prisma-adapter版本和Prisma Schema的字段定义不匹配**导致的:你当前使用的NextAuth v3版本的适配器,默认查询Account表时会使用providerId+providerAccountId的复合唯一键,但是你编写的Schema中对应的字段是provider,二者命名不匹配,触发字段不存在的报错。
解决方法
提供两种适配方案,任选其一即可:
方案1:升级到NextAuth v4(推荐,适配你现有Schema)
你当前的Prisma Schema是按照NextAuth v4的规范编写的,升级到v4版本可以直接复用现有配置:
- 卸载旧版本依赖
npm uninstall next-auth @next-auth/prisma-adapter
- 安装v4版本依赖
npm install next-auth@4 @next-auth/prisma-adapter@latest
- 修改
[...nextauth].js的导入语法,适配v4规范
import NextAuth from "next-auth" import GitHubProvider from "next-auth/providers/github" import EmailProvider from "next-auth/providers/email" import { PrismaAdapter } from "@next-auth/prisma-adapter" import { PrismaClient } from "@prisma/client" const prisma = new PrismaClient() export default NextAuth({ providers: [ GitHubProvider({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, }), EmailProvider({ server: process.env.EMAIL_SERVER, from: process.env.EMAIL_FROM, }), ], adapter: PrismaAdapter(prisma), })
- 重新生成Prisma客户端
npx prisma generate
方案2:保留NextAuth v3,修改Prisma Schema
如果你不想升级版本,可以修改Schema适配v3的字段要求:
- 修改Account模型的字段名和复合唯一键
model Account { id String @id @default(cuid()) userId String type String providerId String // 原provider字段改为providerId providerAccountId String refresh_token String? access_token String? expires_at Int? token_type String? scope String? id_token String? session_state String? oauth_token_secret String? oauth_token String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([providerId, providerAccountId]) // 复合唯一键同步修改 }
- 生成数据库迁移并更新Prisma客户端
npx prisma migrate dev npx prisma generate
内容的提问来源于stack exchange,提问作者timmmmmb
相关产品推荐
相关产品推荐

