如何在 Cloudflare Workers 上使用 Prisma ORM
介绍
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 中
{
"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
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
}
cloudflare 和 workerd 运行时都受支持。在此处阅读有关运行时的更多信息。
这将创建一个具有自增 ID、电子邮件和姓名的 User 模型。
2.4. 配置 Prisma 脚本
将以下脚本添加到您的 package.json 中,以便在 Cloudflare Workers 环境中使用 Prisma
{
"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 接口
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 请求,浏览器会自动发送这些请求,并可能使您的日志混乱
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。这必须在边缘环境中的每个请求中完成
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 创建一个新用户并计算用户总数
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. 返回结果
最后,更新响应以显示新创建的用户和用户总数
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 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。
- 在 X 上关注我们 获取公告、直播活动和实用技巧。
- 加入我们的 Discord 提问、与社区交流,并通过对话获得积极支持。
- 在 YouTube 上订阅 获取教程、演示和直播。
- 在 GitHub 上参与 加星收藏存储库、报告问题或为问题做出贡献。