Next.js13 App Dir中Next-Auth报MISSING_ADAPTER_METHODS_ERROR
解决Next.js 13 App Dir中Next-Auth+PrismaAdapter的[MISSING_ADAPTER_METHODS_ERROR]问题
1. 核心原因:Prisma Schema缺失必需模型或字段
你遇到的错误是因为Next-Auth的PrismaAdapter需要依赖特定数据库模型实现邮箱验证、密码重置逻辑,你的schema可能缺少VerificationToken模型,或者User模型未配置email字段(导致getUserByEmail方法失效)。
修复Prisma Schema
将以下模型添加到prisma/schema.prisma中:
model User { id String @id @default(cuid()) name String? email String? @unique // 必须保留,用于getUserByEmail方法 emailVerified DateTime? image String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt sessions Session[] accounts Account[] } model Session { id String @id @default(cuid()) sessionToken String @unique userId String expires DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Account { id String @id @default(cuid()) userId String type String provider String providerAccountId String refresh_token String? @db.Text access_token String? @db.Text expires_at Int? token_type String? scope String? id_token String? @db.Text session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) } model VerificationToken { identifier String token String @unique expires DateTime @@id([identifier, token]) // 复合主键,符合Next-Auth要求 }
执行命令更新数据库和Prisma客户端:
npx prisma migrate dev npx prisma generate
2. 确保依赖版本兼容
旧版本的@next-auth/prisma-adapter可能未实现createVerificationToken等方法,将相关依赖升级到最新兼容版本:
// package.json { "dependencies": { "next-auth": "^4.24.7", "@next-auth/prisma-adapter": "^1.0.7", "@prisma/client": "^5.7.1", "prisma": "^5.7.1", "@sendgrid/mail": "^7.7.0" } }
执行依赖安装:
npm install
3. 修正Next-Auth配置
确保Auth配置正确传入PrismaAdapter,并且EmailProvider用SendGrid实现邮件发送:
// app/api/auth/[...nextauth]/route.ts import NextAuth from "next-auth"; import { PrismaAdapter } from "@next-auth/prisma-adapter"; import prisma from "@/lib/prisma"; // 你的PrismaClient实例 import EmailProvider from "next-auth/providers/email"; import SendGrid from "@sendgrid/mail"; // 初始化SendGrid SendGrid.setApiKey(process.env.SENDGRID_API_KEY!); export const authOptions = { adapter: PrismaAdapter(prisma), // 必须正确传入PrismaClient实例 providers: [ EmailProvider({ async sendVerificationRequest({ identifier: email, url }) { // 用SendGrid发送验证邮件 await SendGrid.send({ to: email, from: process.env.SENDGRID_FROM_EMAIL!, // 需提前在SendGrid验证该邮箱 subject: "登录验证链接", html: `<p>点击<a href="${url}">此链接</a>完成登录,链接有效期15分钟。</p>`, }); }, }), ], session: { strategy: "database", // 使用数据库存储session,必须开启以适配PrismaAdapter }, // 可选:自定义登录页路径 pages: { signIn: "/signin", }, }; const handler = NextAuth(authOptions); export { handler as GET, handler as POST };
4. App Dir中SessionProvider的正确包装方式
在Next.js 13 App Dir的根layout.tsx中,用SessionProvider包裹整个应用,确保所有组件能访问session:
// app/layout.tsx import { SessionProvider } from "next-auth/react"; import type { ReactNode } from "react"; export default function RootLayout({ children }: { children: ReactNode }) { return ( <html lang="zh-CN"> <body> <SessionProvider>{children}</SessionProvider> </body> </html> ); }
排查顺序建议
- 先确认Prisma Schema的完整性,重新迁移生成客户端
- 检查依赖版本是否兼容,必要时升级
- 验证Auth配置中Adapter和EmailProvider的正确性
- 确认Root Layout中SessionProvider的包裹方式是否正确
内容的提问来源于stack exchange,提问作者hey
相关产品推荐
相关产品推荐

