deno.com
本页内容

如何使用 Prisma 和 Oak 创建 RESTful API

Prisma 一直是我们在 Deno 中最受欢迎的模块之一。考虑到 Prisma 出色的开发者体验以及与众多持久数据存储技术的良好兼容性,这种需求是可以理解的。

我们很高兴向您展示如何在 Deno 中使用 Prisma。

在本操作指南中,我们将使用 Oak 和 Prisma 在 Deno 中设置一个简单的 RESTful API。

让我们开始吧。

查看源码查看视频指南

设置应用程序 跳转到标题

让我们创建 `rest-api-with-prisma-oak` 文件夹并进入该文件夹

mkdir rest-api-with-prisma-oak
cd rest-api-with-prisma-oak

然后,让我们使用 Deno 运行 `prisma init`

deno run --allow-read --allow-env --allow-write npm:prisma@latest init

这会生成 `prisma/schema.prisma`。让我们用以下内容更新它

generator client {
  provider = "prisma-client-js"
  previewFeatures = ["deno"]
  output = "../generated/client"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Dinosaur {
  id          Int     @id @default(autoincrement())
  name        String  @unique
  description String
}

Prisma 还会生成一个 `.env` 文件,其中包含 `DATABASE_URL` 环境变量。让我们将 `DATABASE_URL` 分配给一个 PostgreSQL 连接字符串。在此示例中,我们将使用 Supabase 提供的免费 PostgreSQL 数据库

接下来,让我们创建数据库 Schema

deno run -A npm:prisma@latest db push

完成后,我们需要生成一个 Prisma Client

deno run -A --unstable-detect-cjs npm:prisma@latest generate --no-engine

在 Prisma Data Platform 中设置 Accelerate 跳转到标题

开始使用 Prisma Data Platform

  1. 注册一个免费的 Prisma Data Platform 账户
  2. 创建一个项目。
  3. 导航到您创建的项目。
  4. 通过提供数据库的连接字符串来启用 Accelerate。
  5. 生成一个 Accelerate 连接字符串并将其复制到剪贴板。

将以 `prisma://` 开头的 Accelerate 连接字符串分配给 `.env` 文件中的 `DATABASE_URL`,替换您现有的连接字符串。

接下来,让我们创建一个填充脚本来填充数据库。

为数据库填充数据 跳转到标题

创建 `./prisma/seed.ts`

touch prisma/seed.ts

然后在 `./prisma/seed.ts` 中

import { Prisma, PrismaClient } from "../generated/client/deno/edge.ts";

const prisma = new PrismaClient({
  datasourceUrl: envVars.DATABASE_URL,
});

const dinosaurData: Prisma.DinosaurCreateInput[] = [
  {
    name: "Aardonyx",
    description: "An early stage in the evolution of sauropods.",
  },
  {
    name: "Abelisaurus",
    description: "Abel's lizard has been reconstructed from a single skull.",
  },
  {
    name: "Acanthopholis",
    description: "No, it's not a city in Greece.",
  },
];

/**
 * Seed the database.
 */

for (const u of dinosaurData) {
  const dinosaur = await prisma.dinosaur.create({
    data: u,
  });
  console.log(`Created dinosaur with id: ${dinosaur.id}`);
}
console.log(`Seeding finished.`);

await prisma.$disconnect();

现在我们可以使用以下命令运行 `seed.ts`

deno run -A --env prisma/seed.ts

[!提示]

`--env` 标志用于指示 Deno 从 `.env` 文件加载环境变量。

完成后,您应该能够通过运行以下命令在 Prisma Studio 上查看您的数据

deno run -A npm:prisma studio

您应该看到类似于以下截图的内容

New dinosaurs are in Prisma dashboard

创建 API 路由 跳转到标题

我们将使用 `oak` 来创建 API 路由。现在让我们保持它们简单。

让我们创建一个 `main.ts` 文件

touch main.ts

然后,在您的 `main.ts` 文件中

import { PrismaClient } from "./generated/client/deno/edge.ts";
import { Application, Router } from "jsr:@oak/oak";

/**
 * Initialize.
 */

const prisma = new PrismaClient({
  datasources: {
    db: {
      url: envVars.DATABASE_URL,
    },
  },
});
const app = new Application();
const router = new Router();

/**
 * Setup routes.
 */

router
  .get("/", (context) => {
    context.response.body = "Welcome to the Dinosaur API!";
  })
  .get("/dinosaur", async (context) => {
    // Get all dinosaurs.
    const dinosaurs = await prisma.dinosaur.findMany();
    context.response.body = dinosaurs;
  })
  .get("/dinosaur/:id", async (context) => {
    // Get one dinosaur by id.
    const { id } = context.params;
    const dinosaur = await prisma.dinosaur.findUnique({
      where: {
        id: Number(id),
      },
    });
    context.response.body = dinosaur;
  })
  .post("/dinosaur", async (context) => {
    // Create a new dinosaur.
    const { name, description } = await context.request.body("json").value;
    const result = await prisma.dinosaur.create({
      data: {
        name,
        description,
      },
    });
    context.response.body = result;
  })
  .delete("/dinosaur/:id", async (context) => {
    // Delete a dinosaur by id.
    const { id } = context.params;
    const dinosaur = await prisma.dinosaur.delete({
      where: {
        id: Number(id),
      },
    });
    context.response.body = dinosaur;
  });

/**
 * Setup middleware.
 */

app.use(router.routes());
app.use(router.allowedMethods());

/**
 * Start server.
 */

await app.listen({ port: 8000 });

现在,让我们运行它

deno run -A --env main.ts

让我们访问 `localhost:8000/dinosaurs`

List of all dinosaurs from REST API

接下来,让我们使用此 `curl` 命令 `POST` 一个新用户

curl -X POST http://localhost:8000/dinosaur -H "Content-Type: application/json" -d '{"name": "Deno", "description":"The fastest, most secure, easiest to use Dinosaur ever to walk the Earth."}'

您现在应该在 Prisma Studio 上看到一个新行

New dinosaur Deno in Prisma

太棒了!

接下来是什么? 跳转到标题

使用 Deno 和 Prisma 构建您的下一个应用程序将更高效、更有趣,因为这两种技术都提供了直观的开发者体验,包括数据建模、类型安全和强大的 IDE 支持。

如果您有兴趣将 Prisma 连接到 Deno Deploy,请查阅这篇精彩指南

您找到所需内容了吗?

隐私政策