部署到 Vercel Edge Functions 和中间件
本页面涵盖了将使用 Prisma Client 的应用程序部署到 Vercel Edge Middleware 或部署到 Vercel Function 的 Vercel Edge Runtime 中与数据库通信所需了解的一切信息。
要将 Vercel Function 部署到 Vercel Edge Runtime,您可以将 export const runtime = 'edge'
设置在 Vercel Function 的请求处理程序之外。
部署到 Vercel Edge Functions 和 Edge Middleware 的一般注意事项
使用边缘兼容驱动程序
Vercel 的 Edge Runtime 目前仅支持有限的数据库驱动程序集
- Neon Serverless 使用 HTTP 访问数据库(也兼容 Vercel Postgres)
- PlanetScale Serverless 使用 HTTP 访问数据库
@libsql/client
用于访问 Turso 数据库
请注意,node-postgres
(pg
) 目前在 Vercel Edge Functions 上不受支持。
当部署使用 Prisma ORM 的 Vercel Edge Function 时,您需要使用这些 边缘兼容驱动程序 之一及其各自的 驱动程序适配器 用于 Prisma ORM。
注意:Prisma Accelerate 使您能够从任何边缘函数提供商访问任何数据库。无需边缘兼容驱动程序。
将数据库连接 URL 设置为环境变量
首先,确保 DATABASE_URL
设置为 Prisma schema 中 datasource
的 url
datasource db {
provider = "postgresql" // this might also be `mysql` or another value depending on your database
url = env("DATABASE_URL")
}
开发
在开发中,您可以通过 DATABASE_URL
环境变量配置数据库连接(例如,使用 .env
文件)。
生产
当将 Edge Function 部署到生产环境时,您需要使用 vercel
CLI 设置数据库连接
npx vercel env add DATABASE_URL
此命令是交互式的,将在后续步骤中要求您选择环境并提供 DATABASE_URL
的值。
或者,您可以通过 Vercel 仪表板中项目的 UI 配置环境变量。
在 postinstall
钩子中生成 Prisma Client
在您的 package.json
中,您应该添加一个如下所示的 "postinstall"
部分
{
// ...,
"postinstall": "prisma generate"
}
免费帐户的大小限制
Vercel 对 免费帐户有 1 MB 的大小限制。如果您的应用程序捆绑包包含 Prisma ORM 超过此大小,我们建议升级到付费帐户或使用 Prisma Accelerate 来部署您的应用程序。
特定于数据库的注意事项和示例
本节提供特定于数据库的说明,用于使用 Prisma ORM 部署 Vercel Edge Functions。
先决条件
作为以下部分的先决条件,您需要本地运行的 Vercel Edge Function(通常以 Next.js API 路由的形式出现),并安装 Prisma 和 Vercel CLI。
如果您还没有,您可以运行这些命令从头开始设置 Next.js 应用程序(按照 Vercel Functions Quickstart 的说明)
npm install -g vercel
npx create-next-app@latest
npm install prisma --save-dev
npx prisma init
我们将在下面的示例中使用默认的 User
模型
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
Vercel Postgres
如果您正在使用 Vercel Postgres,您需要
- 使用
@prisma/adapter-neon
数据库适配器(通过driverAdapters
预览功能),因为 Vercel Postgres 在底层使用 Neon - 请注意,Vercel 默认将数据库连接字符串的环境变量称为
POSTGRES_PRISMA_URL
,而 Prisma 文档中使用的默认名称通常是DATABASE_URL
;使用 Vercel 的命名,您需要在datasource
块中设置以下字段datasource db {
provider = "postgresql"
url = env("POSTGRES_PRISMA_URL") // uses connection pooling
directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection
}
1. 配置 Prisma schema 和数据库连接
注意:如果您没有要部署的项目,请按照先决条件中的说明引导一个包含 Prisma ORM 的基本 Next.js 应用程序。
首先,确保正确配置数据库连接。在您的 Prisma schema 中,将 datasource
块的 url
设置为 POSTGRES_PRISMA_URL
,并将 directUrl
设置为 POSTGRES_URL_NON_POOLING
环境变量。您还需要启用 driverAdapters
功能标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("POSTGRES_PRISMA_URL") // uses connection pooling
directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection
}
接下来,您需要将 POSTGRES_PRISMA_URL
和 POSTGRES_URL_NON_POOLING
环境变量设置为您的数据库连接的值。
如果您运行了 npx prisma init
,您可以使用此命令创建的 .env
文件来设置这些变量
POSTGRES_PRISMA_URL="postgres://user:[email protected]:5432/name?pgbouncer=true&connect_timeout=15"
POSTGRES_URL_NON_POOLING="postgres://user:[email protected]:5432/name"
2. 安装依赖项
接下来,安装所需的软件包
npm install @prisma/adapter-neon
npm install @neondatabase/serverless
3. 配置 postinstall
钩子
接下来,在您的 package.json
中的 scripts
部分添加一个新键
{
// ...
"scripts": {
// ...
"postinstall": "prisma generate"
}
}
4. 迁移您的数据库 schema(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移数据库 schema 以创建 Prisma schema 中定义的 User
表(如果您已在数据库中拥有所需的所有表,则可以跳过此步骤)
npx prisma migrate dev --name init
5. 在您的 Vercel Edge Function 中使用 Prisma Client 向数据库发送查询
如果您从头开始创建项目,则可以按如下所示创建一个新的边缘函数。
首先,创建一个新的 API 路由,例如,使用以下命令
mkdir src/app/api
mkdir src/app/api/edge
touch src/app/api/edge/route.ts
这是一个示例代码片段,您可以使用它来实例化 PrismaClient
并在您刚创建的新的 app/api/edge/route.ts
文件中向数据库发送查询
import { NextResponse } from 'next/server'
import { PrismaClient } from '@prisma/client'
import { PrismaNeon } from '@prisma/adapter-neon'
import { Pool } from '@neondatabase/serverless'
export const runtime = 'edge'
export async function GET(request: Request) {
const neon = new Pool({ connectionString: process.env.POSTGRES_PRISMA_URL })
const adapter = new PrismaNeon(neon)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
return NextResponse.json(users, { status: 200 })
}
6. 在本地运行 Edge Function
使用以下命令运行应用程序
npm run dev
您现在可以通过以下 URL 访问 Edge Function:https://127.0.0.1:3000/api/edge
。
7. 设置 POSTGRES_PRISMA_URL
环境变量并部署 Edge Function
运行以下命令以使用 Vercel 部署您的项目
npx vercel deploy
请注意,一旦在 Vercel 上创建了项目,您将需要设置 POSTGRES_PRISMA_URL
环境变量(如果这是您的首次部署,则很可能失败)。您可以通过 Vercel UI 或运行以下命令来执行此操作
npx vercel env add POSTGRES_PRISMA_URL
此时,您可以从 Vercel 仪表板获取已部署应用程序的 URL,并通过 /api/edge
路由访问边缘函数。
PlanetScale
如果您正在使用 PlanetScale 数据库,您需要
- 使用
@prisma/adapter-planetscale
数据库适配器(通过driverAdapters
预览功能)
1. 配置 Prisma schema 和数据库连接
注意:如果您没有要部署的项目,请按照先决条件中的说明引导一个包含 Prisma ORM 的基本 Next.js 应用程序。
首先,确保正确配置数据库连接。在您的 Prisma schema 中,将 datasource
块的 url
设置为 DATABASE_URL
环境变量。您还需要启用 driverAdapters
功能标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
relationMode = "prisma" // required for PlanetScale (as by default foreign keys are disabled)
}
接下来,您需要在您的 .env
文件中设置 DATABASE_URL
环境变量,Prisma 和 Next.js 都使用该文件来读取您的环境变量
DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:[email protected]/demo-cf-worker-ps?sslaccept=strict"
2. 安装依赖项
接下来,安装所需的软件包
npm install @prisma/adapter-planetscale
npm install @planetscale/database
3. 配置 postinstall
钩子
接下来,在您的 package.json
中的 scripts
部分添加一个新键
{
// ...
"scripts": {
// ...
"postinstall": "prisma generate"
}
}
4. 迁移您的数据库 schema(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移数据库 schema 以创建 Prisma schema 中定义的 User
表(如果您已在数据库中拥有所需的所有表,则可以跳过此步骤)
npx prisma db push
5. 在 Edge Function 中使用 Prisma Client 向数据库发送查询
如果您从头开始创建项目,则可以按如下所示创建一个新的边缘函数。
首先,创建一个新的 API 路由,例如,使用以下命令
mkdir src/app/api
mkdir src/app/api/edge
touch src/app/api/edge/route.ts
这是一个示例代码片段,您可以使用它来实例化 PrismaClient
并在您刚创建的新的 app/api/edge/route.ts
文件中向数据库发送查询
import { NextResponse } from 'next/server'
import { PrismaClient } from '@prisma/client'
import { PrismaPlanetScale } from '@prisma/adapter-planetscale'
import { Client } from '@planetscale/database'
export const runtime = 'edge'
export async function GET(request: Request) {
const client = new Client({ url: process.env.DATABASE_URL })
const adapter = new PrismaPlanetScale(client)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
return NextResponse.json(users, { status: 200 })
}
6. 在本地运行 Edge Function
使用以下命令运行应用程序
npm run dev
您现在可以通过以下 URL 访问 Edge Function:https://127.0.0.1:3000/api/edge
。
7. 设置 DATABASE_URL
环境变量并部署 Edge Function
运行以下命令以使用 Vercel 部署您的项目
npx vercel deploy
请注意,一旦在 Vercel 上创建了项目,您将需要设置 DATABASE_URL
环境变量(如果这是您的首次部署,则很可能失败)。您可以通过 Vercel UI 或运行以下命令来执行此操作
npx vercel env add DATABASE_URL
此时,您可以从 Vercel 仪表板获取已部署应用程序的 URL,并通过 /api/edge
路由访问边缘函数。
Neon
如果您正在使用 Neon 数据库,您需要
- 使用
@prisma/adapter-neon
数据库适配器(通过driverAdapters
预览功能)
1. 配置 Prisma schema 和数据库连接
注意:如果您没有要部署的项目,请按照先决条件中的说明引导一个包含 Prisma ORM 的基本 Next.js 应用程序。
首先,确保正确配置数据库连接。在您的 Prisma schema 中,将 datasource
块的 url
设置为 DATABASE_URL
环境变量。您还需要启用 driverAdapters
功能标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
接下来,您需要在您的 .env
文件中设置 DATABASE_URL
环境变量,Prisma 和 Next.js 都使用该文件来读取您的环境变量
DATABASE_URL="postgresql://janedoe:[email protected]/neondb?sslmode=require"
2. 安装依赖项
接下来,安装所需的软件包
npm install @prisma/adapter-neon
npm install @neondatabase/serverless
3. 配置 postinstall
钩子
接下来,在您的 package.json
中的 scripts
部分添加一个新键
{
// ...
"scripts": {
// ...
"postinstall": "prisma generate"
}
}
4. 迁移您的数据库 schema(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移数据库 schema 以创建 Prisma schema 中定义的 User
表(如果您已在数据库中拥有所需的所有表,则可以跳过此步骤)
npx prisma migrate dev --name init
5. 在 Edge Function 中使用 Prisma Client 向数据库发送查询
如果您从头开始创建项目,则可以按如下所示创建一个新的边缘函数。
首先,创建一个新的 API 路由,例如,使用以下命令
mkdir src/app/api
mkdir src/app/api/edge
touch src/app/api/edge/route.ts
这是一个示例代码片段,您可以使用它来实例化 PrismaClient
并在您刚创建的新的 app/api/edge/route.ts
文件中向数据库发送查询
import { NextResponse } from 'next/server'
import { PrismaClient } from '@prisma/client'
import { PrismaNeon } from '@prisma/adapter-neon'
import { Pool } from '@neondatabase/serverless'
export const runtime = 'edge'
export async function GET(request: Request) {
const neon = new Pool({ connectionString: process.env.DATABASE_URL })
const adapter = new PrismaNeon(neon)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
return NextResponse.json(users, { status: 200 })
}
6. 在本地运行 Edge Function
使用以下命令运行应用程序
npm run dev
您现在可以通过以下 URL 访问 Edge Function:https://127.0.0.1:3000/api/edge
。
7. 设置 DATABASE_URL
环境变量并部署 Edge Function
运行以下命令以使用 Vercel 部署您的项目
npx vercel deploy
请注意,一旦在 Vercel 上创建了项目,您将需要设置 DATABASE_URL
环境变量(如果这是您的首次部署,则很可能失败)。您可以通过 Vercel UI 或运行以下命令来执行此操作
npx vercel env add DATABASE_URL
此时,您可以从 Vercel 仪表板获取已部署应用程序的 URL,并通过 /api/edge
路由访问边缘函数。