Как создать RESTful API с Prisma и Oak
Prisma стала одним из самых востребованных модулей для работы с Deno. Этот спрос вполне объясним, учитывая, что Prisma обеспечивает превосходный опыт разработки и хорошо интегрируется со многими технологиями постоянного хранения данных.
Мы рады показать вам, как использовать Prisma с Deno.
В этом руководстве мы настроим простое RESTful API в Deno с использованием Oak и Prisma.
Давайте начнем.
Посмотреть исходный код или посмотреть видео-руководство.
Настройка приложения
Давайте создадим папку rest-api-with-prisma-oak и перейдем в неё:
mkdir rest-api-with-prisma-oak
cd rest-api-with-prisma-oak
Затем, давайте запустим prisma init с помощью Deno:
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. В этом примере мы будем использовать бесплатную базу данных PostgreSQL от Supabase.
Далее, давайте создадим схему базы данных:
deno run -A npm:prisma@latest db push
После этого нам нужно сгенерировать Prisma Client:
deno run -A --unstable npm:prisma@latest generate --no-engine
Настройка Accelerate в Prisma Data Platform
Чтобы начать работу с Prisma Data Platform:
- Зарегистрируйтесь на бесплатной платформе Prisma Data Platform.
- Создайте проект.
- Перейдите в созданный проект.
- Включите Accelerate, предоставив строку подключения к вашей базе данных.
- Сгенерируйте строку подключения Accelerate и скопируйте ее в буфер обмена.
Назначьте строку подключения Accelerate, которая начинается с prisma://, переменной DATABASE_URL в вашем файле .env, заменив существующую строку подключения.
Далее, давайте создадим скрипт для заполнения базы данных.
Заполнение вашей базы данных
Создайте ./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
Вы должны увидеть что-то подобное приведенному ниже снимку экрана:

Создание маршрутов 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";
/**
* 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:

Далее, давайте POST нового пользователя с помощью этой curl команды:
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:

Отлично!
Что дальше?
Создание ваших следующих приложений будет более продуктивным и интересным с Deno и Prisma, так как обе технологии обеспечивают интуитивный опыт разработки с моделированием данных, безопасностью типов и поддержкой современных IDE.
Если вы заинтересованы в подключении Prisma к Deno Deploy, посмотрите это замечательное руководство.
© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/tutorials/how_to_with_npm/prisma