You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
  );
}

排查顺序建议

  1. 先确认Prisma Schema的完整性,重新迁移生成客户端
  2. 检查依赖版本是否兼容,必要时升级
  3. 验证Auth配置中Adapter和EmailProvider的正确性
  4. 确认Root Layout中SessionProvider的包裹方式是否正确

内容的提问来源于stack exchange,提问作者hey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:35:03