跳至主要内容

如何在 Cloudflare Workers 上使用 Prisma ORM

15 分钟

介绍

Prisma ORM 提供类型安全的数据库访问,而 Cloudflare Workers 则允许您在边缘部署无服务器代码。结合 Prisma Postgres,您将获得一个具有低延迟数据库访问能力的全球分布式后端。

在本指南中,您将学习如何在 Cloudflare Workers 项目中集成 Prisma ORM 和 Prisma Postgres 数据库。您可以在 GitHub 上找到本指南的完整示例。

先决条件

1. 设置项目

创建一个新的 Cloudflare Workers 项目

npm create cloudflare@latest prisma-cloudflare-worker -- --type=hello-world --ts=true --git=true --deploy=false

进入新创建的项目目录

cd prisma-cloudflare-worker

2. 安装和配置 Prisma

2.1. 安装依赖项

要开始使用 Prisma,您需要安装一些依赖项

npm install prisma dotenv-cli @types/pg --save-dev
npm install @prisma/client @prisma/adapter-pg dotenv pg
信息

如果你使用的是其他数据库提供程序(MySQL、SQL Server、SQLite),请安装相应的驱动程序适配器包,而不是 @prisma/adapter-pg。有关更多信息,请参阅 数据库驱动程序

安装后,在项目中初始化 Prisma

npx prisma init --db
信息

在设置 Prisma Postgres 数据库时,您需要回答几个问题。选择离您位置最近的区域,并为您的数据库选择一个易记的名称,例如“我的 Cloudflare Workers 项目”

这将创建

  • 一个包含 schema.prisma 文件的 prisma/ 目录
  • 一个包含您的 Prisma 配置的 prisma.config.ts 文件
  • 一个已设置 DATABASE_URL.env 文件

2.2. 在 Cloudflare Workers 中启用 Node.js 兼容性

Cloudflare Workers 需要启用 Node.js 兼容性才能与 Prisma 配合使用。将 nodejs_compat 兼容性标志添加到您的 wrangler.jsonc

wrangler.jsonc
{
"name": "prisma-cloudflare-worker",
"main": "src/index.ts",
"compatibility_flags": ["nodejs_compat"],
"compatibility_date": "2024-01-01"
}

2.3. 定义您的 Prisma Schema

prisma/schema.prisma 文件中,添加以下 User 模型并将运行时设置为 cloudflare

prisma/schema.prisma
generator client {
provider = "prisma-client"
runtime = "cloudflare"
output = "../src/generated/prisma"
}

datasource db {
provider = "postgresql"
}

model User {
id Int @id @default(autoincrement())
email String
name String
}
注意

cloudflareworkerd 运行时都受支持。在此处阅读有关运行时的更多信息

这将创建一个具有自增 ID、电子邮件和姓名的 User 模型。

2.4. 配置 Prisma 脚本

将以下脚本添加到您的 package.json 中,以便在 Cloudflare Workers 环境中使用 Prisma

package.json
{
"scripts": {
"migrate": "prisma migrate dev",
"generate": "prisma generate",
"studio": "prisma studio"
// ... existing scripts
}
}

2.5. 运行迁移并生成 Prisma Client

现在,运行以下命令来创建数据库表

npm run migrate

出现提示时,命名您的迁移(例如 init)。

然后生成 Prisma Client

npm run generate

这将在 src/generated/prisma/client 目录中生成 Prisma Client。

3. 将 Prisma 集成到 Cloudflare Workers 中

3.1. 导入 Prisma Client 并配置类型

src/index.ts 的顶部,导入生成的 Prisma Client 和 PostgreSQL 适配器,并为类型安全的环境变量定义 Env 接口

src/index.ts
import { PrismaClient } from './generated/prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';

export interface Env {
DATABASE_URL: string;
}

export default {
async fetch(request, env, ctx): Promise<Response> {
return new Response('Hello World!');
},
} satisfies ExportedHandler<Env>;

3.2. 处理 favicon 请求

添加一个检查以过滤掉 favicon 请求,浏览器会自动发送这些请求,并可能使您的日志混乱

src/index.ts
import { PrismaClient } from './generated/prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';

export interface Env {
DATABASE_URL: string;
}

export default {
async fetch(request, env, ctx): Promise<Response> {
const path = new URL(request.url).pathname;
if (path === '/favicon.ico')
return new Response('Resource not found', {
status: 404,
headers: {
'Content-Type': 'text/plain',
},
});

return new Response('Hello World!');
},
} satisfies ExportedHandler<Env>;

3.3. 初始化 Prisma Client

创建一个数据库适配器并使用它初始化 Prisma Client。这必须在边缘环境中的每个请求中完成

src/index.ts
import { PrismaClient } from './generated/prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';

export interface Env {
DATABASE_URL: string;
}

export default {
async fetch(request, env, ctx): Promise<Response> {
const path = new URL(request.url).pathname;
if (path === '/favicon.ico')
return new Response('Resource not found', {
status: 404,
headers: {
'Content-Type': 'text/plain',
},
});

const adapter = new PrismaPg({
connectionString: env.DATABASE_URL,
});

const prisma = new PrismaClient({
adapter,
});

return new Response('Hello World!');
},
} satisfies ExportedHandler<Env>;
警告

在 Cloudflare Workers 等边缘环境中,您为每个请求创建一个新的 Prisma Client 实例。这与您通常实例化单个客户端并重复使用的长时间运行的 Node.js 服务器不同。

3.4. 创建用户并查询数据库

现在使用 Prisma Client 创建一个新用户并计算用户总数

src/index.ts
import { PrismaClient } from './generated/prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';

export interface Env {
DATABASE_URL: string;
}

export default {
async fetch(request, env, ctx): Promise<Response> {
const path = new URL(request.url).pathname;
if (path === '/favicon.ico')
return new Response('Resource not found', {
status: 404,
headers: {
'Content-Type': 'text/plain',
},
});

const adapter = new PrismaPg({
connectionString: env.DATABASE_URL,
});

const prisma = new PrismaClient({
adapter,
});

const user = await prisma.user.create({
data: {
email: `Prisma-Postgres-User-${Math.ceil(Math.random() * 1000)}@gmail.com`,
name: 'Jon Doe',
},
});

const userCount = await prisma.user.count();

return new Response('Hello World!');
},
} satisfies ExportedHandler<Env>;

3.5. 返回结果

最后,更新响应以显示新创建的用户和用户总数

src/index.ts
import { PrismaClient } from './generated/prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';

export interface Env {
DATABASE_URL: string;
}

export default {
async fetch(request, env, ctx): Promise<Response> {
const path = new URL(request.url).pathname;
if (path === '/favicon.ico')
return new Response('Resource not found', {
status: 404,
headers: {
'Content-Type': 'text/plain',
},
});

const adapter = new PrismaPg({
connectionString: env.DATABASE_URL,
});

const prisma = new PrismaClient({
adapter,
});

const user = await prisma.user.create({
data: {
email: `Prisma-Postgres-User-${Math.ceil(Math.random() * 1000)}@gmail.com`,
name: 'Jon Doe',
},
});

const userCount = await prisma.user.count();

return new Response(`\
Created new user: ${user.name} (${user.email}).
Number of users in the database: ${userCount}.
`);
},
} satisfies ExportedHandler<Env>;

3.6. 在本地测试您的 Worker

首先,为您的 Worker 环境生成 TypeScript 类型

npx wrangler types --no-strict-vars

然后启动开发服务器

npm run dev

在浏览器中打开 https://:8787。每次刷新页面时,都会创建一个新用户。您应该会看到类似于

Created new user: Jon Doe (Prisma-Postgres-User-742@gmail.com).
Number of users in the database: 5.

3.7. 使用 Prisma Studio 检查您的数据

要查看数据库内容,请打开 Prisma Studio

npm run studio

这将打开一个浏览器窗口,您可以在其中查看和编辑 User 表数据。

4. 部署到 Cloudflare Workers

4.1. 将您的数据库 URL 设置为 secret

在部署之前,您需要将 DATABASE_URL 设置为 Cloudflare Workers 中的 secret。这可以在生产环境中保护您的数据库连接字符串。

npx wrangler secret put DATABASE_URL

出现提示时,粘贴 .env 文件中的数据库连接字符串。

4.2. 部署您的 Worker

将您的 Worker 部署到 Cloudflare

npm run deploy

部署后,Cloudflare 将为您提供 Worker 的实时 URL(例如 https://prisma-postgres-worker.your-subdomain.workers.dev)。

在浏览器中访问该 URL,您将看到您的 Worker 正在生产环境中创建用户!

总结

您已成功使用 Prisma ORM 创建了一个连接到 Prisma Postgres 数据库的 Cloudflare Workers 应用程序。您的 Worker 现在正在边缘运行,并具有低延迟的数据库访问。

后续步骤

现在您已经拥有一个连接到 Prisma Postgres 数据库的 Cloudflare Workers 应用程序,您可以

  • 添加路由以处理不同的 HTTP 方法(GET、POST、PUT、DELETE)
  • 使用更多模型和关系扩展您的 Prisma schema
  • 实现身份验证和授权
  • Hono 用于更强大的 Cloudflare Workers 路由框架(请参阅我们的 Hono 指南
  • 使用 Prisma Postgres 启用查询缓存以获得更好的性能

更多信息


与 Prisma 保持联系

通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

© . This site is unofficial and not affiliated with Prisma Data, Inc.