跳至主要內容

使用 Prisma 和 Oak 建立 RESTful API

Prisma 是我們最常被要求與 Deno 搭配使用的模組之一。由於 Prisma 的開發人員體驗一流,而且支援許多持續性資料儲存技術,因此需求量很大,這點不難理解。

我們很興奮能向您展示如何將 Prisma 與 Deno 搭配使用。

在此操作指南中,我們將使用 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 也會產生一個包含 DATABASE_URL 環境變數的 .env 檔案。讓我們將 DATABASE_URL 指定給 PostgreSQL 連線字串。在此範例中,我們將使用 Supabase 的免費 PostgreSQL 資料庫

接下來,讓我們建立資料庫架構

deno run -A npm:prisma@latest db push

完成後,我們需要產生一個 Prisma Client

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

在 Prisma 資料平台中設定 Accelerate

開始使用 Prisma 資料平台

  1. 註冊一個免費的 Prisma 資料平台帳戶
  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";
import { load } from "https://deno.land/std@0.220.0/dotenv/mod.ts";

const envVars = await load();

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 prisma/seed.ts

執行後,您應該可以在 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 "https://deno.land/x/oak@v11.1.0/mod.ts";
import { load } from "https://deno.land/std@0.220.0/dotenv/mod.ts";

const envVars = await load();

/**
* 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 main.ts

讓我們拜訪 localhost:8000/dinosaurs

List of all dinosaurs from REST API

接下來,讓我們使用這個 curl 指令 POST 一個新使用者

curl -X POST https://127.0.0.1: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,請查看這篇精彩指南