跳至主要內容

如何使用 Prisma ORM 搭配 Cloudflare Workers

15 分鐘

簡介

Prisma ORM 提供型別安全的資料庫存取,而 Cloudflare Workers 讓您能夠在邊緣節點(Edge)部署無伺服器程式碼。搭配 Prisma Postgres,您將獲得一個全球分佈且具備低延遲資料庫存取的後端。

在本指南中,您將學習如何將 Prisma ORM 與 Prisma Postgres 資料庫整合到 Cloudflare Workers 專案中。您可以在 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 資料庫時,您需要回答幾個問題。請選擇離您最近的區域,並為資料庫取一個好記的名字,例如「My Cloudflare Workers Project」。

這將建立:

  • 一個包含 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 模型並將執行環境(runtime)設為 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 配接器(adapter),並為型別安全的環境變數定義 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 會提供一個 URL,您的 Worker 將會在那裡執行(例如 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.