2024 年 3 月 12 日

Prisma ORM 对 Edge Functions 的支持现已进入预览阶段

我们非常高兴地宣布,对 Edge Functions 的支持现已进入预览阶段!您现在可以从 Vercel Edge Functions、Vercel Edge Middleware、Cloudflare Workers 和 Cloudflare Pages 使用 Prisma ORM 访问您的数据库。快来试试吧

Prisma ORM Support for Edge Functions (Preview)

什么是 Edge Functions?

Edge Functions 是一种轻量级无服务器计算形式,分布在全球各地。它们允许您将应用程序部署和运行得尽可能接近最终用户。

Edge Functions 可以让您的应用更快

得益于 Edge Functions 的全球分布式特性,用户与数据中心之间的距离得以缩短。这降低了请求延迟并提高了响应时间,使得 Edge Functions 成为提升应用性能并显著改善用户体验的绝佳方法。

Edge Functions 中的技术限制

Vercel Edge Functions 和 Cloudflare Workers 不使用标准的 Node.js 运行时。相反,它们在 V8 isolates 中运行代码。因此,这些 Edge Functions 只能访问标准 Node.js API 的一小部分,并且计算资源(CPU 和内存)也受到限制。

特别是,无法自由打开 TCP 连接的限制使得从 Edge Function 与传统数据库通信变得困难。虽然 Cloudflare 引入了 connect() API,该 API 支持有限的 TCP 连接,但这仍然只能使用与该 API 兼容的特定数据库驱动程序进行数据库访问。

注意:在 Node.js 生态系统中,最流行且与 Cloudflare Workers 兼容的传统数据库驱动程序是用于 PostgreSQL 的 node-postgres。然而,目前也正在努力使 node-mysql2 驱动程序中的 MySQL 与 Cloudflare Workers 兼容。

现代数据库提供商,例如 Neon 或 PlanetScale,通过发布无服务器驱动程序,这些驱动程序通过 HTTP 与数据库通信,解决了这一限制。

使用 Prisma ORM 在 Edge Functions 中访问数据库 🎉

虽然在早期版本中可以在 Edge Function 中使用 Prisma ORM,但这始终需要使用 Prisma Accelerate 作为 Edge Function 和数据库之间的代理。

由于上述技术限制,无法“直接”将使用 Prisma ORM 的应用程序部署到边缘环境

  • 数据库访问只能通过特定的驱动程序(无服务器驱动程序或与 Cloudflare 的 connect() 兼容的驱动程序)工作。这里的问题在于,Prisma ORM 过去只在其查询引擎中内置了内置驱动程序,因此无法使用兼容的 Node.js 驱动程序。
  • 上传到 Edge Function 的应用程序捆绑包大小限制使得无法使用 Prisma ORM,因为其查询引擎过大并超出了大小限制。
  • Edge Functions 只允许访问有限的一组 Node.js API。然而,Prisma Client 的工作需要其中的一些 API,因此无法访问这些 API 要求 Prisma Client 绕过一些限制。

我们很高兴地宣布,v5.11.0 版本 消除了这些限制,并在预览阶段支持在 Edge Functions 中运行 Prisma ORM 🎉

得益于最近引入的 驱动程序适配器 预览功能,开发者现在可以使用 Prisma ORM 与 Node.js 生态系统中他们喜爱的数据库驱动程序配合使用!

此外,我们已成功大幅减小了 Prisma ORM 查询引擎的大小,使其现在可以适应 Edge Function 有限的运行时环境。

如何在 Edge Function 中使用 Prisma ORM

🔬 如果您有兴趣查看实际示例,我们整理了一个小型 GitHub 仓库,演示了如何使用 Prisma ORM 和 Vercel Edge Functions 访问您的数据库。

请按照以下步骤学习如何在 Cloudflare Worker 中使用 PlanetScale 数据库 启动和运行 Prisma ORM(或查看我们的文档,了解如何使用其他边缘部署和数据库提供商组合)。

0. 前提条件

在执行以下步骤之前,请确保您已具备

  • 您的机器上已安装 Node.js
  • 一个 Cloudflare 账户
  • 一个正在运行的 PlanetScale 实例及其连接字符串可用

1. 设置您的应用程序

使用 create-cloudflare-cli 初始化您的项目,并按照 CLI 向导中的步骤操作,为提示选择默认选项

2. 设置 Prisma

导航到新目录并安装 Prisma CLI

接下来,使用以下命令在您的项目中初始化 Prisma

上述命令

  • 在 prisma/schema.prisma 中创建了 Prisma schema 文件
  • 创建了一个 .env 文件用于存储环境变量

该 .env 文件包含一个占位符 DATABASE_URL 环境变量。

使用连接到您的 PlanetScale 数据库的实际连接字符串更新该值。它可能看起来类似于这样

注意:上面的连接字符串使用了数据库的用户名密码名称的占位符。请务必将其替换为您自己的数据库值。

将您的 Prisma schema 更新如下

上述 Prisma schema

  • 启用 driverAdapters 预览功能标志
  • 定义一个 Log 模型和 Level 枚举

要将您的数据模型映射到数据库,您需要使用 prisma db push CLI 命令

这在您的数据库中创建了一个新的 Log 表,您现在可以在 PlanetScale 控制面板中查看它。

3. 编写 Cloudflare Worker 函数

在您的 wrangler.toml 文件中,添加一个 [vars] 键和您的数据库连接字符串(像之前一样,将 USERNAME、 PASSWORD 和 DATABASE 的占位符替换为您自己的 PlanetScale 实例的值)

注意:由于这是一个演示应用,我们将明文连接字符串添加到 wrangler.toml 中。然而,由于此文件通常会被提交到版本控制中,您在生产环境中切勿这样做,因为它会公开暴露您的数据库连接。相反,请使用Cloudflare 的 secret 配置

接下来,安装 PlanetScale 无服务器数据库驱动程序及其 驱动程序适配器

使用以下代码更新 src/index.ts 文件中的 Cloudflare Worker 示例片段

启动应用程序

从终端输出中,您现在可以打开指向 localhost 的 URL,或者按下 b 键打开浏览器并调用 Worker 函数。

如果一切顺利,您将看到类似于此的输出

4. 发布到 Cloudflare Workers

您现在可以通过运行以下命令来部署应用程序

此命令会将您的 Edge Function 部署到 Cloudflare,并输出可以访问它的 URL。

快来试试并分享您的反馈

我们很想知道您的想法!快来尝试使用 VercelCloudflare 的 Edge 部署新支持,并通过 Twitter 或 Discord 与我们分享您的反馈🚀

如果您遇到任何问题,可以在 此处创建 bug 报告。

不要错过下一篇文章!

订阅 Prisma 新闻通讯