跳至主要内容

如何在 Hono 中使用 Prisma

15 分钟

介绍

Prisma ORM 提供类型安全的数据库访问,而 Hono 专为快速、轻量级的 Web 应用程序而构建。结合 Prisma Postgres,您将获得一个快速、轻量级的后端,可以通过 Node.js、Cloudflare 或许多其他运行时部署。

本指南将教您如何在 Hono 后端应用程序中将 Prisma ORM 与 Prisma Postgres 数据库集成。您可以在 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 文件中,添加以下模型并更改生成器以使用 prisma-client 提供程序

prisma/schema.prisma
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])
}

这将创建两个模型:UserPost,它们之间存在一对多关系。

prisma.config.ts 中,在文件顶部导入 dotenv

prisma.config.ts
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 客户端生成器

现在,运行以下命令创建数据库表并生成 Prisma Client

npx prisma migrate dev --name init
npx prisma generate

2.4. 填充数据库

让我们添加一些种子数据来用示例用户和帖子填充数据库。

prisma/ 目录中创建一个名为 seed.ts 的新文件

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 如何运行此脚本

prisma.config.ts
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 中间件

/src 内部,创建一个 lib 目录并在其中创建一个 prisma.ts 文件。此文件将用于创建和导出您的 Prisma Client 实例。像这样设置 Prisma 客户端

src/lib/prisma.ts
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 并在请求之间重用它,以避免耗尽数据库连接。在无服务器环境或使用连接池(例如 Accelerate)时,为每个请求创建一个客户端是可以接受的。

3.2 环境变量和类型

默认情况下,Hono 不会从 .env 加载任何环境变量。dotenv 处理这个问题,它将读取该文件并通过 process.env 公开它们。Hono 可以获得额外的类型,以知道 withPrisma 中间件将在 Hono 上下文上设置一个 prisma

src/index.ts
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 内部创建一个新路由

现在,创建一个 GET 路由,它从数据库中获取 Users 数据,确保通过将每个用户的 Posts 添加到 include 字段中来包含它们

src/index.ts
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

应该会打印出“服务器正在 https://:3000 上运行”的日志。从这里,可以通过访问 https://:3000/users 或从命令行运行 curl 来查看数据

curl https://:3000/users | jq

您已完成!您已经创建了一个使用 Prisma 连接到 Prisma Postgres 数据库的 Hono 应用程序。下一步,您可以在下面找到一些资源来探索,以及扩展项目的下一步。

下一步

现在您已经有了一个连接到 Prisma Postgres 数据库的 Hono 应用程序,您可以

  • 使用更多模型和关系扩展您的 Prisma schema
  • 添加创建/更新/删除路由和表单
  • 探索身份验证和验证
  • 使用 Prisma Postgres 启用查询缓存以获得更好的性能

更多信息


与 Prisma 保持联系

通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

© . This site is unofficial and not affiliated with Prisma Data, Inc.