如何使用 Prisma ORM 搭配 Cloudflare Workers
簡介
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
{
"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
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 配接器(adapter),並為型別安全的環境變數定義 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 會提供一個 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 旅程: 我們的活躍社群。保持資訊靈通、參與其中,並與其他開發者合作
- 在 X 上關注我們 以獲取公告、現場活動和實用技巧。
- 加入我們的 Discord 提出問題、與社群對話,並透過對話獲得積極支援。
- 在 YouTube 上訂閱 查看教學、演示和直播。
- 在 GitHub 上交流 透過為存放庫加星標、報告問題或為 issue 做出貢獻。