Spec-Zone.ru › Deno 2

Как создать 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:

  1. Зарегистрируйтесь на бесплатной платформе Prisma Data Platform.
  2. Создайте проект.
  3. Перейдите в созданный проект.
  4. Включите Accelerate, предоставив строку подключения к вашей базе данных.
  5. Сгенерируйте строку подключения 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

Вы должны увидеть что-то подобное приведенному ниже снимку экрана:

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";

/**
 * 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

Далее, давайте 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:

New dinosaur Deno in Prisma

Отлично!

Что дальше?

Создание ваших следующих приложений будет более продуктивным и интересным с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API