跳至内容
从 NextAuth.js v4 迁移?阅读 我们的迁移指南.

Prisma 适配器

资源

设置

安装

npm install @prisma/client @auth/prisma-adapter
npm install prisma --save-dev

环境变量

Prisma 需要设置环境变量来建立与数据库的连接并检索数据。Prisma 需要 DATABASE_URL 环境变量来创建连接。有关更多信息,请阅读 文档

DATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA

配置

为了使用 Prisma ORM 提高性能,我们可以设置 Prisma 实例以确保整个项目中只创建一个实例,然后根据需要从任何文件导入它。这种方法避免了每次使用 PrismaClient 时都重新创建实例。最后,我们可以从 auth.ts 文件配置中导入 Prisma 实例。

prisma.ts
import { PrismaClient } from "@prisma/client"
 
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }
 
export const prisma = globalForPrisma.prisma || new PrismaClient()
 
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma
⚠️

如果您使用中间件或任何其他 Edge 运行时,建议使用版本 @prisma/[email protected] 或更高版本。有关更多信息,请参见下面的 Edge 兼容性

./auth.ts
import NextAuth from "next-auth"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/prisma"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [],
})

Edge 兼容性

Prisma 在版本 5.12.0 中为其客户端提供了 Edge 运行时支持。您可以在其 Edge 文档 中了解更多信息。这需要特定的数据库驱动程序,因此仅与某些数据库类型/托管提供商兼容。在开始之前,请查看他们的 支持驱动程序列表。您可以查看 此处 的一个使用 next-auth 和 Prisma 在 Edge 上运行的 Auth.js 示例应用程序。

有关 Edge 兼容性的更多信息,请查看我们的 Edge 兼容性指南

原始的数据库 Edge 运行时解决方法(将您的 auth.ts 配置分成两个)将在下面保留。

旧的 Edge 解决方法

目前,Prisma 仍在努力与 Vercel 的 Edge 运行时完全兼容。查看此处跟踪的问题 此处,以及 Prisma 关于 5.9.1 中早期 Edge 支持的公告 变更日志。有两个选项可以解决此问题

  • 使用 Prisma 的 加速 功能
  • 按照我们的 Edge 兼容性 页面作为解决方法。这使用 jwt 会话策略并将 auth.ts 配置分成两个文件。

使用 Prisma 与 jwt 会话策略和 @prisma/[email protected] 或更高版本无需进行任何其他修改,只需确保您在中间件中不进行任何数据库查询。

自从 @prisma/[email protected] 之后,Prisma 在实例化时不再抛出与 Edge 运行时不兼容的错误,而是在查询时抛出。因此,只要您不在中间件中执行任何查询,就可以在中间件中使用的文件中导入它。

模式

您需要使用至少 Prisma 2.26.0。在 prisma/schema.prisma 中创建一个模式文件,其中包含以下模型。

应用模式

这将创建一个 SQL 迁移文件并执行它

npm exec prisma migrate dev

请注意,您需要在环境变量 DATABASE_URL 中指定您的数据库连接字符串。您可以通过在项目根目录中设置 .env 文件来做到这一点。请注意,Prisma 不支持 .env.local 语法,它必须命名为 .env。有关更多信息,请查看他们的 环境变量文档

生成 Prisma 客户端

prisma migrate dev 也会生成 Prisma 客户端,但如果您需要手动重新生成它,可以运行以下命令。

npm exec prisma generate

开发工作流程

当您正在开发应用程序并对数据库模式进行更改时,每次对模式进行更改时都需要重新运行 migrate 命令,以便 Prisma 可以 (1) 生成迁移文件并将其应用于底层数据库,以及 (2) 使用最新的类型和模型方法重新生成项目中的 Prisma 客户端。

npm exec prisma migrate dev

命名约定

如果混合的 snake_casecamelCase 列名称对您和/或您的底层数据库系统来说是一个问题,我们建议使用 Prisma 的 @map() 功能 来更改字段名称。这不会影响 Auth.js,但会让您能够将列名称自定义为您喜欢的任何命名约定。

例如,迁移到 snake_case 和复数表名。

schema.prisma
model Account {
  id                 String  @id @default(cuid())
  userId             String  @map("user_id")
  type               String
  provider           String
  providerAccountId  String  @map("provider_account_id")
  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])
  @@map("accounts")
}
 
model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique @map("session_token")
  userId       String   @map("user_id")
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
 
  @@map("sessions")
}
 
model User {
  id            String    @id @default(cuid())
  name          String?
  email         String?   @unique
  emailVerified DateTime? @map("email_verified")
  image         String?
  accounts      Account[]
  sessions      Session[]
 
  @@map("users")
}
 
model VerificationToken {
  identifier String
  token      String
  expires    DateTime
 
  @@unique([identifier, token])
  @@map("verification_tokens")
}
Auth.js © Balázs Orbán 和团队 -2024