如何使用 Prisma 搭配 Hono
簡介
Prisma ORM 提供型別安全的資料庫存取,而 Hono 專為快速、輕量級的網路應用程式而生。結合 Prisma Postgres,您將獲得一個快速、輕量級的後端,並可部署於 Node.js、Cloudflare 或許多其他執行環境中。
在本指南中,您將學習如何將 Prisma ORM 與 Prisma Postgres 資料庫整合至 Hono 後端應用程式中。您可以在 GitHub 上找到本指南的完整範例。
先決條件
1. 設定您的專案
建立一個新的 Hono 專案
npm create hono@latest
- 目標目錄?
my-app - 您想使用哪個模板?
nodejs - 安裝依賴項目? (推薦)
Yes - 您想使用哪個套件管理工具?
npm
2. 安裝並設定 Prisma
2.1. 安裝依賴項目
要開始使用 Prisma,您需要安裝一些依賴項目
npm install prisma tsx @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 --output ../src/generated/prisma
設定 Prisma Postgres 資料庫時,您需要回答幾個問題。請選擇最接近您所在位置的區域,並為您的資料庫取一個易記的名稱,例如 "My Hono Project"
這將建立:
- 一個包含
schema.prisma檔案的prisma/目錄 - 一個包含您的 Prisma 設定的
prisma.config.ts - 一個已設定好
DATABASE_URL的.env檔案
2.2. 定義您的 Prisma Schema
在 prisma/schema.prisma 檔案中,加入下列模型並將 generator 修改為使用 prisma-client 提供者
generator client {
provider = "prisma-client"
output = "../src/generated/prisma"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
}
這會建立兩個模型:User 和 Post,且兩者之間具有一對多關係。
在 prisma.config.ts 中,於檔案開頭引入 dotenv
import { defineConfig, env } from "prisma/config";
import "dotenv/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: env("DATABASE_URL"),
},
});
2.3. 設定 Prisma Client generator
現在,執行以下指令來建立資料庫表格並產生 Prisma Client
npx prisma migrate dev --name init
npx prisma generate
2.4. 植入資料庫 (Seed)
讓我們加入一些種子資料,以在資料庫中填充範例使用者與貼文。
在 prisma/ 目錄中建立一個名為 seed.ts 的新檔案
import { PrismaClient, Prisma } from "../src/generated/prisma/client.js";
import { PrismaPg } from "@prisma/adapter-pg";
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL!,
});
const prisma = new PrismaClient({
adapter,
});
const userData: Prisma.UserCreateInput[] = [
{
name: "Alice",
email: "alice@prisma.io",
posts: {
create: [
{
title: "Join the Prisma Discord",
content: "https://pris.ly/discord",
published: true,
},
{
title: "Prisma on YouTube",
content: "https://pris.ly/youtube",
},
],
},
},
{
name: "Bob",
email: "bob@prisma.io",
posts: {
create: [
{
title: "Follow Prisma on Twitter",
content: "https://www.twitter.com/prisma",
published: true,
},
],
},
},
];
export async function main() {
for (const u of userData) {
await prisma.user.create({ data: u });
}
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
現在,透過更新您的 prisma.config.ts 來告訴 Prisma 如何執行此指令碼
import { defineConfig, env } from "prisma/config";
import "dotenv/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
seed: "tsx prisma/seed.ts"
},
datasource: {
url: env("DATABASE_URL"),
},
});
執行種子指令碼
npx prisma db seed
並開啟 Prisma Studio 來檢視您的資料
npx prisma studio
3. 將 Prisma 整合至 Hono
3.1. 建立 Prisma 中介軟體 (Middleware)
在 /src 內,建立一個 lib 目錄並在其中建立 prisma.ts 檔案。此檔案將用於建立並匯出您的 Prisma Client 執行個體。請按如下方式設定 Prisma Client
import type { Context, Next } from 'hono';
import { PrismaClient } from '../generated/prisma/client.js';
import { PrismaPg } from '@prisma/adapter-pg';
import "dotenv/config";
const databaseUrl = process.env.DATABASE_URL;
if (!databaseUrl) {
throw new Error('DATABASE_URL is not set');
}
const adapter = new PrismaPg({
connectionString: databaseUrl,
});
const prisma = new PrismaClient({ adapter });
function withPrisma(c: Context, next: Next) {
if (!c.get('prisma')) {
c.set('prisma', prisma);
}
return next();
}
export default withPrisma;
我們建議使用連線池(例如 Prisma Accelerate)來有效率地管理資料庫連線。
如果您選擇不使用連線池,在長駐環境(例如 Node.js 伺服器)中,請實例化單一的 PrismaClient 並在各請求間重複使用它,以避免耗盡資料庫連線。在 Serverless 環境中,或使用連線池(例如 Accelerate)時,為每個請求建立一個客戶端是可以接受的。
3.2 環境變數與型別
預設情況下,Hono 不會從 .env 載入任何環境變數。dotenv 可以處理這點,它會讀取該檔案並透過 process.env 暴露它們。Hono 可以取得額外的型別資訊,讓它知道 withPrisma 中介軟體會在 Hono 上下文中設定一個 prisma 鍵
import { Hono } from "hono";
import { serve } from "@hono/node-server";
import type { PrismaClient } from "./generated/prisma/client.js";
type ContextWithPrisma = {
Variables: {
prisma: PrismaClient;
};
};
const app = new Hono<ContextWithPrisma>();
app.get("/", (c) => {
return c.text("Hello Hono!");
});
serve(
{
fetch: app.fetch,
port: 3000,
},
(info) => {
console.log(`Server is running on https://:${info.port}`);
}
);
如果使用 Cloudflare Workers,環境變數會自動設定到 Hono 的上下文中,因此可以跳過 dotenv。
3.3. 建立 GET 路由
使用 Hono 的 app.get 函式從資料庫擷取資料。這會執行任何資料庫查詢並將資料以 JSON 格式回傳。
在 src/index.ts 內部建立一個新路由
現在,建立一個從資料庫擷取 Users 資料的 GET 路由,並確保透過將 Posts 加入 include 欄位來包含每個使用者的貼文
import withPrisma from './lib/prisma.js';
app.get('/users', withPrisma, async (c) => {
const prisma = c.get('prisma');
const users = await prisma.user.findMany({
include: { posts: true },
});
return c.json({ users });
});
3.4. 顯示資料
透過呼叫 package.json 中的 dev 指令碼來啟動 Hono 應用程式
npm run dev
您應該會看到 "Server is running on https://:3000" 的日誌。從這裡,您可以造訪 https://:3000/users 或從命令列執行 curl 來檢視資料
curl https://:3000/users | jq
完成!您已經建立了一個連接至 Prisma Postgres 資料庫的 Hono 應用程式。關於下一步,您可以在下方探索一些資源,以及擴充專案的後續步驟。
後續步驟
現在您已經擁有一個連接至 Prisma Postgres 資料庫且可運作的 Hono 應用程式,您可以:
- 使用更多模型與關係來擴充您的 Prisma schema
- 加入建立/更新/刪除 (CRUD) 的路由與表單
- 探索驗證與身份驗證
- 啟用 Prisma Postgres 的查詢快取以獲得更好的效能
更多資訊
與 Prisma 保持聯繫
透過以下方式與我們聯繫,繼續您的 Prisma 旅程: 我們的活躍社群。保持資訊靈通、參與其中,並與其他開發者合作
- 在 X 上關注我們 以獲取公告、現場活動和實用技巧。
- 加入我們的 Discord 提出問題、與社群對話,並透過對話獲得積極支援。
- 在 YouTube 上訂閱 查看教學、演示和直播。
- 在 GitHub 上交流 透過為存放庫加星標、報告問題或為 issue 做出貢獻。