PrismaとPostgreSQLを使用してREST APIを作成する方法

著者は、Write for Donationsプログラムの一環として、寄付を受け取るためにDiversity in Tech FundとTech Education Fundを選びました。

イントロダクション

Prismaは、Node.jsとTypeScript向けのオープンソースのORMです。Prismaは、主に3つの主要なツールで構成されています。

  • Prisma Client: An auto-generated and type-safe query builder.
  • Prisma Migrate: A powerful data modeling and migration system.
  • Prisma Studio: A GUI to view and edit data in your database.

これらのツールは、データベースの作業フローにおけるアプリケーション開発者の生産性を向上させることを目的としています。Prismaの最大の利点の一つは、その抽象化レベルです。複雑なSQLクエリやスキーマの変更を解決する代わりに、Prismaを使用することでアプリケーション開発者はより直感的な方法でデータについて考えることができます。

このチュートリアルでは、PrismaとPostgreSQLデータベースを使用して、TypeScriptで小規模なブログアプリケーションのためのREST APIを構築します。Dockerを使用してローカルにPostgreSQLデータベースをセットアップし、Expressを使用してREST APIのルートを実装します。チュートリアルの最後には、HTTPリクエストに応答してデータベースのデータを読み書きできる、ローカルで実行されるウェブサーバーが作成されます。

前提条件

このチュートリアルでは、以下を前提としています。

  • Node.js version 14 or higher installed on your machine. You can use one of the How To Install Node.js and Create a Local Development Environment guides for your OS to set this up.
  • Docker installed on your machine (to run the PostgreSQL database). You can install on macOS and Windows via the Docker website, or follow How To Install and User Docker for Linux distributions.

このチュートリアルでは、TypeScriptとREST APIについての基本的な知識があると役立ちますが、必須ではありません。

ステップ1 — TypeScriptプロジェクトの作成

このステップでは、npmを使用してプレーンなTypeScriptプロジェクトをセットアップします。このプロジェクトは、このチュートリアルで構築するREST APIの基礎となります。

まず、プロジェクト用の新しいディレクトリを作成してください。

  1. mkdir my-blog

 

次に、ディレクトリに移動して空のnpmプロジェクトを初期化します。ここでの-yオプションは、コマンドの対話的なプロンプトをスキップすることを意味します。プロンプトを実行するためには、コマンドから-yを削除してください。

  1. cd my-blog
  2. npm init -y

 

これらのプロンプトに関する詳細は、「How To Use Node.js Modules with npm and package.json」のステップ1を参照してください。

デフォルトの応答が設定されている場合、次のような出力が受け取れます。

Output

Wrote to /…/my-blog/package.json: { “name”: “my-blog”, “version”: “1.0.0”, “description”: “”, “main”: “index.js”, “scripts”: { “test”: “echo \”Error: no test specified\” && exit 1″ }, “keywords”: [], “author”: “”, “license”: “ISC” }

このコマンドは、npmプロジェクトの設定ファイルとして使用する最小限のpackage.jsonファイルを作成します。これで、プロジェクトにTypeScriptを設定する準備が整いました。

プレーンな TypeScript のセットアップには、以下のコマンドを実行してください。

  1. npm install typescript ts-node @types/node –save-dev

 

あなたのプロジェクトには、以下の3つのパッケージを開発の依存関係としてインストールします。

  • typescript: The TypeScript toolchain.
  • ts-node: A package to run TypeScript applications without prior compilation to JavaScript.
  • @types/node: The TypeScript type definitions for Node.js.

最後にするべきことは、作成するアプリケーションに適切にTypeScriptが設定されていることを確認するために、tsconfig.jsonファイルを追加することです。

最初に、ファイルを作成するために次のコマンドを実行してください。

  1. nano tsconfig.json

 

以下のJSONコードをファイルに追加してください。

私のブログのtsconfig.json
{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["esnext"],
    "esModuleInterop": true
  }
}

ファイルを保存して終了してください。

この設定は、TypeScript プロジェクトの標準的かつ最小構成です。設定ファイルの各プロパティについて学びたい場合は、TypeScript のドキュメントを確認してください。

あなたはnpmを使用してプレーンなTypeScriptプロジェクトをセットアップしました。次に、Dockerを使用してPostgreSQLデータベースをセットアップし、それにPrismaを接続します。

ステップ2 — PostgreSQLを使用してPrismaをセットアップする

この手順では、Prisma CLIをインストールし、初期のPrismaスキーマファイルを作成し、PostgreSQLをDockerでセットアップし、それにPrismaを接続します。 Prismaスキーマは、Prismaの設定のメインファイルであり、データベースのスキーマが含まれています。

以下のコマンドを使用して、Prisma CLIをインストールしてください。

  1. npm install prisma –save-dev

 

ベストプラクティスとして、プリズマ CLIをプロジェクト内にローカルにインストールすることが推奨されています。この方法は、マシン上に複数のプリズマプロジェクトがある場合にバージョンの競合を避けるのに役立ちます。

次に、Dockerを使用してPostgreSQLデータベースをセットアップします。以下のコマンドを使用して新しいDocker Composeファイルを作成してください。

  1. nano docker-compose.yml

 

新しく作成したファイルに次のコードを追加してください。

私のブログのdocker-compose.yml
version: '3.8'
services:
  postgres:
    image: postgres:10.3
    restart: always
    environment:
      - POSTGRES_USER=sammy
      - POSTGRES_PASSWORD=your_password
    volumes:
      - postgres:/var/lib/postgresql/data
    ports:
      - '5432:5432'
volumes:
  postgres:

このDocker Composeファイルは、ポート5432経由でアクセス可能なPostgreSQLデータベースを設定します。現在、データベースの認証情報はsammy(ユーザー)とyour_password(パスワード)に設定されています。これらの認証情報をお好みのユーザー名とパスワードに調整してください。ファイルを保存して終了してください。

この設定を行った後、次のコマンドでPostgreSQLデータベースサーバーを起動してください。

  1. docker-compose up -d

 

このコマンドの出力はこれに似ているでしょう。

Output

Pulling postgres (postgres:10.3)… 10.3: Pulling from library/postgres f2aa67a397c4: Pull complete 6de83ca23e55: Pull complete . . . Status: Downloaded newer image for postgres:10.3 Creating my-blog_postgres_1 … done

以下のコマンドを使用して、データベースサーバーが稼働しているか確認できます。

  1. docker ps

 

このコマンドは、このようなものを出力します。

Output

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8547f8e007ba postgres:10.3 “docker-entrypoint.s…” 3 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp my-blog_postgres_1

データベースサーバーが稼働している状態で、あなたはPrismaのセットアップを作成することができます。Prisma CLIから以下のコマンドを実行してください。

  1. npx prisma init

 

このコマンドを実行すると、以下の出力が表示されます。

Output

✔ Your Prisma schema was created at prisma/schema.prisma. You can now open it in your favorite editor.

最良の方法として、Prisma CLIを使用するすべての呼び出しの前に、npxをプレフィックスとして付けることで、ローカルインストールが使用されていることを確認する必要があります。

コマンドを実行すると、Prisma CLIはプロジェクト内にprismaという新しいフォルダを作成します。その中には、schema.prismaというファイルがあります。このファイルは、Prismaプロジェクトのメイン設定ファイルであり(データモデルを含む)、データベース接続URLを定義する場所でもあります。また、このコマンドはルートフォルダに.envドットエンブファイルも追加します。

Prismaがデータベースの場所を認識できるようにするには、.envファイルを開き、DATABASE_URL環境変数を調整してください。

最初に.envファイルを開いてください。

(Note: The response above is a one possible way to paraphrase the given statement in Japanese.)

  1. nano .env

 

以下のように環境変数を更新することができます。

私のブログ/.env
DATABASE_URL="postgresql://sammy:your_password@localhost:5432/my-blog?schema=public"

Docker Compose ファイルで指定したデータベースの認証情報を変更することを忘れずに行ってください。接続 URL の形式について詳しくは、Prisma のドキュメントを参照してください。

作業が終わりましたら、ファイルを保存して終了してください。

このステップでは、Dockerを使用してPostgreSQLデータベースを設定し、Prisma CLIをインストールし、環境変数を介してPrismaをデータベースに接続します。次のセクションでは、データモデルを定義し、データベーステーブルを作成します。

ステップ3 – データモデルの定義とデータベーステーブルの作成

このステップでは、Prismaスキーマファイルでデータモデルを定義します。このデータモデルは、Prisma Migrateを使ってデータベースにマッピングされ、データモデルに対応するテーブルの作成に使用されるSQL文が生成されます。ブログアプリケーションを作成しているため、アプリケーションの主要なエンティティはユーザーと投稿です。

プリズマは独自のデータモデリング言語を使用して、アプリケーションデータの形状を定義します。

まず、次のコマンドでschema.prismaファイルを開いてください。

  1. nano prisma/schema.prisma

 

以下のモデル定義を追加してください。モデルは、ジェネレータクライアントのブロックの直後にファイルの最後に配置することができます。

私のブログのスキーマは、”my-blog/prisma/schema.prisma” です。
. . .
model User {
  id    Int     @default(autoincrement()) @id
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @default(autoincrement()) @id
  title     String
  content   String?
  published Boolean @default(false)
  author    User?   @relation(fields: [authorId], references: [id])
  authorId  Int?
}

あなたはUserとPostという2つのモデルを定義しています。それぞれのモデルには、モデルのプロパティを表すいくつかのフィールドがあります。モデルはデータベースのテーブルにマッピングされます。フィールドは個々の列を表します。

一つのユーザーモデルと投稿モデルの間には、UserとPostの関係フィールドによって指定される一対多の関係があります。これは、一つのユーザーが多くの投稿と関連付けられることを意味します。

ファイルを保存して終了してください。

これらのモデルを用意したら、Prisma Migrateを使用してデータベース内に対応するテーブルを作成できます。ターミナルで次のコマンドを実行してください。

  1. npx prisma migrate dev –name init

 

このコマンドは、新しいSQLマイグレーションをファイルシステムに作成し、データベースに送信します。コマンドに提供される–name initオプションは、マイグレーションの名前を指定し、ファイルシステム上に作成されるマイグレーションフォルダの名前にも使用されます。

このコマンドの出力は、これに似たものになります。

Output

Environment variables loaded from .env Prisma schema loaded from prisma/schema.prisma Datasource “db”: PostgreSQL database “my-blog”, schema “public” at “localhost:5432” PostgreSQL database my-blog created at localhost:5432 The following migration(s) have been created and applied from new schema changes: migrations/ └─ 20201209084626_init/ └─ migration.sql Running generate… (Use –skip-generate to skip the generators) ✔ Generated Prisma Client (2.13.0) to ./node_modules/@prisma/client in 75ms

prisma/migrations/20201209084626_init/migration.sql ディレクトリにある SQL マイグレーションファイルには、データベースに対して実行された以下のステートメントが含まれています(ファイル名のハイライト部分は環境によって異なる場合があります)。

以下の通り、日本語で言い換えます(1つのオプションのみ):
prisma/migrations/20201209084626_init/migration.sql
プリズマ/マイグレーション/20201209084626_init/マイグレーション. SQL
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL,
    "email" TEXT NOT NULL,
    "name" TEXT,

    PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Post" (
"id" SERIAL,
    "title" TEXT NOT NULL,
    "content" TEXT,
    "published" BOOLEAN NOT NULL DEFAULT false,
    "authorId" INTEGER,

    PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "User.email_unique" ON "User"("email");

-- AddForeignKey
ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;

prisma migrate devコマンドに–create-onlyオプションを追加すれば、生成されたSQLマイグレーションファイルをカスタマイズすることもできます。例えば、トリガーを設定したり、基になるデータベースの他の機能を使用したりすることができます。

このステップでは、Prismaスキーマでデータモデルを定義し、Prisma Migrateを使用して対応するデータベースのテーブルを作成しました。次のステップでは、プロジェクトにPrisma Clientをインストールしてデータベースにクエリを実行できるようにします。

ステップ4 – プレーンスクリプトでPrismaクライアントのクエリを探索する。

Prisma Clientは、Node.jsやTypeScriptアプリケーションからデータベースにプログラムで読み書きするために使用できる、自動生成された型安全なクエリビルダーです。これは、REST APIルート内でのデータベースアクセスに使用され、従来のORM、プレーンSQLクエリ、カスタムデータアクセスレイヤ、またはデータベースとの連携方法を置き換えます。

この段階では、Prisma Clientをインストールし、それを使用して送信できるクエリに慣れることになります。次のステップでREST APIのルートを実装する前に、プレーンで実行可能なスクリプトでいくつかのPrisma Clientクエリを探索します。

最初に、Prisma Client npmパッケージを使用して、プロジェクトフォルダにPrisma Clientをインストールしてください。

  1. npm install @prisma/client

 

次に、ソースファイルを格納する新しいディレクトリ「src」を作成してください。

  1. mkdir src

 

新しいディレクトリ内にTypeScriptファイルを作成してください。

  1. nano src/index.ts

 

すべてのPrisma Clientのクエリは、コード内で待機できるプロミスを返します。これには、クエリを非同期関数内で送信する必要があります。

src/index.ts ファイルに、スクリプト内で実行される非同期関数を持つ、以下のテンプレートを追加してください。

私のブログのソースファイルであるindex.ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  // ... your Prisma Client queries will go here
}

main()
  .catch((e) => console.error(e))
  .finally(async () => await prisma.$disconnect())

以下はボイラープレートの簡単な概要です。

    1. 以前にインストールした @prisma/client npm パッケージから PrismaClient のコンストラクタをインポートします。

 

    1. コンストラクタを呼び出して、prisma というインスタンスを取得して PrismaClient を初期化します。

 

    1. main という非同期関数を定義し、そこに Prisma Client のクエリを追加します。

 

    main 関数を呼び出し、潜在的な例外をキャッチし、Prisma Client が prisma.$disconnect() で開いているデータベース接続を確実に閉じます。

メイン機能が揃っている場合、スクリプトにPrisma Clientのクエリを追加することができます。ハイライトされた行をasync関数内に含めるように、index.tsを調整してください。

私のブログのソースコードは、index.tsに保存されています。
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const newUser = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
      posts: {
        create: {
          title: 'Hello World',
        },
      },
    },
  })
  console.log('Created new user: ', newUser)

  const allUsers = await prisma.user.findMany({
    include: { posts: true },
  })
  console.log('All users: ')
  console.dir(allUsers, { depth: null })
}

main()
  .catch((e) => console.error(e))
  .finally(async () => await prisma.$disconnect())

このコードでは、プリズマクライアントのクエリを2つ使用しています。

  • create: Creates a new User record. You use a nested write query to create both a User and Post record in the same query.
  • findMany: Reads all existing User records from the database. You provide the include option that additionally loads the related Post records for each User record.

ファイルを保存し、閉じる。

以下のコマンドでスクリプトを実行してください。

  1. npx ts-node src/index.ts

 

以下の内容がターミナルに表示されます。

Output

Created new user: { id: 1, email: ‘alice@prisma.io’, name: ‘Alice’ } [ { id: 1, email: ‘alice@prisma.io’, name: ‘Alice’, posts: [ { id: 1, title: ‘Hello World’, content: null, published: false, authorId: 1 } ] }

Note

注意:データベースのGUIを使用している場合は、UserテーブルとPostテーブルを確認することで、データが作成されたことを検証できます。または、npx prisma studioを実行して、Prisma Studioでデータを調査することもできます。

今、データベースでPrisma Clientを使用してデータの読み取りと書き込みを行いました。残りの手順では、サンプルREST APIのルートを実装します。

ステップ5 — 最初のREST APIルートの実装

このステップでは、アプリケーションにExpressをインストールします。ExpressはNode.jsでよく使われるウェブフレームワークで、このプロジェクトでREST APIのルートを実装するために使用します。最初に実装するルートは、GETリクエストを使用してAPIからすべてのユーザーを取得することができるものです。ユーザーデータはPrisma Clientを使用してデータベースから取得されます。

以下のコマンドを使用してExpressをインストールしてください。

  1. npm install express

 

TypeScriptを使用しているため、開発依存関係として該当する型もインストールする必要があります。それを行うには、以下のコマンドを実行してください。

  1. npm install @types/express –save-dev

 

依存関係が整っている状態で、Expressアプリケーションをセットアップすることができます。

あなたのメインソースファイルをもう一度開いてください。

  1. nano src/index.ts

 

index.tsのコードをすべて削除し、以下のコードを使ってREST APIを開始するために置き換えてください。

私のブログのソースコード内のindex.ts
import { PrismaClient } from '@prisma/client'
import express from 'express'

const prisma = new PrismaClient()
const app = express()

app.use(express.json())

// ... your REST API routes will go here

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

こちらがコードの簡単な解説です。

    1. 以下の文を日本語で自然に言い換えます。1つのオプションで大丈夫です:

あなたはPrismaClientとexpressをそれぞれのnpmパッケージからインポートします。
コンストラクタを呼び出してPrismaClientをインスタンス化し、prismaというインスタンスを取得します。
express()を呼び出してExpressアプリを作成します。
express.json()ミドルウェアを追加して、ExpressでJSONデータを正しく処理できるようにします。
サーバーをポート3000で起動します。

今は最初のルートを実装できます。app.useとapp.listenの間に、ハイライトされた部分を追加して、app.getコールを作成してください。

私のブログのソースコードが入っている場所は、my-blog/src/index.tsです。
. . .
app.use(express.json())

app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany()
  res.json(users)
})

app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)

ファイルに追加したら、保存して終了します。そして、以下のコマンドを使用してローカルのウェブサーバーを起動してください。

  1. npx ts-node src/index.ts

 

以下の出力を受け取ります。

Output

REST API server ready at: http://localhost:3000

「/users」ルートにアクセスするには、ブラウザをhttp://localhost:3000/usersまたは他のHTTPクライアントに向けることができます。

このチュートリアルでは、ターミナルベースのHTTPクライアントであるcurlを使用して、すべてのREST APIルートをテストします。

Note

注意:GUIベースのHTTPクライアントを使用したい場合は、HoppscotchやPostmanなどの代替オプションを使用することができます。

自分のルートをテストするために、新しいターミナルウィンドウまたはタブを開いてください(これにより、ローカルのウェブサーバーが続行されます)。次のコマンドを実行してください。

  1. curl http://localhost:3000/users

 

前のステップで作成したユーザーデータを受け取ることになります。

Output

[{“id”:1,”email”:”alice@prisma.io”,”name”:”Alice”}]

今回は、/usersルートの実装において、findMany呼び出しにincludeオプションが渡されていないため、投稿の配列は含まれていません。

あなたは最初のREST APIルートを/usersに実装しました。次のステップでは、APIにさらなる機能を追加するために残りのREST APIルートを実装します。

ステップ6- 残りのREST APIルートの実装

このステップでは、残りのブログアプリケーションのREST APIルートを実装します。最終的には、ウェブサーバーはさまざまなGET、POST、PUT、DELETEリクエストを処理します。

実装するルートには、以下のオプションが含まれます。

HTTP Method Route Description
GET /feed Fetches all published posts.
GET /post/:id Fetches a specific post by its ID.
POST /user Creates a new user.
POST /post Creates a new post (as a draft).
PUT /post/publish/:id Sets the published field of a post to true.
DELETE post/:id Deletes a post by its ID.

最初に、残りの2つのGETルートを実装します。

キーボードでCTRL+Cを押してサーバーを停止することができます。次に、編集のためにファイルを開いた後、index.tsファイルを更新することができます。

  1. nano src/index.ts

 

次に、/app.getユーザールートの実装の後に、ハイライトされた行を追加してください。

私のブログのソースコードの場所は、my-blog/src/index.tsです。
. . .

app.get('/feed', async (req, res) => {
  const posts = await prisma.post.findMany({
    where: { published: true },
    include: { author: true }
  })
  res.json(posts)
})

app.get(`/post/:id`, async (req, res) => {
  const { id } = req.params
  const post = await prisma.post.findUnique({
    where: { id: Number(id) },
  })
  res.json(post)
})

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

このコードは、2つのGETリクエストのためのAPIルートを実装しています。

  • /feed: Returns a list of published posts.
  • /post/:id: Returns a specific post by its ID.

プリズマ クライアントは両方の実装で使用されます。/feed ルートの実装では、プリズマ クライアントで送信するクエリは、published 列が true のすべての投稿レコードをフィルタリングします。さらに、返された各投稿に関連する著者情報もフェッチするために、プリズマ クライアントのクエリには include も使用されます。/post/:id ルートの実装では、URLのパスから取得したIDを用いて、データベースから特定の投稿レコードを読み取ります。

ファイルを保存して終了してください。次に、以下のコマンドを使用してサーバーを再起動してください。

  1. npx ts-node src/index.ts

 

/フィードルートをテストするために、2番目のターミナルセッションで次のcurlコマンドを使用できます。

  1. curl http://localhost:3000/feed

 

まだ投稿がないため、応答は空の配列です。

Output

[]

/post/:id ルートをテストするために、以下のcurlコマンドを使用できます。

  1. curl http://localhost:3000/post/1

 

最初に作成した投稿を返すコマンドです。

Output

{“id”:1,”title”:”Hello World”,”content”:null,”published”:false,”authorId”:1}

次に、2つのPOSTルートを実装します。元のターミナルセッションで、CTRL+Cでサーバーを停止し、その後、index.tsを編集するために開いてください。

  1. nano src/index.ts

 

三つのGETルートの実装の後に、index.tsにハイライトされた行を追加してください。

私のブログのソースコードのindex.tsファイル。
. . .

app.post(`/user`, async (req, res) => {
  const result = await prisma.user.create({
    data: { ...req.body },
  })
  res.json(result)
})

app.post(`/post`, async (req, res) => {
  const { title, content, authorEmail } = req.body
  const result = await prisma.post.create({
    data: {
      title,
      content,
      published: false,
      author: { connect: { email: authorEmail } },
    },
  })
  res.json(result)
})

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

このコードは、2つのPOSTリクエストに対するAPIルートを実装しています。

  • /user: Creates a new user in the database.
  • /post: Creates a new post in the database.

以前と同様に、Prisma Clientは両方の実装で使用されています。/userルートの実装では、HTTPリクエストのボディからの値をPrisma Clientのcreateクエリに渡します。

「/post」ルートはより複雑です。HTTPリクエストのボディから値を直接渡すことはできません。代わりに、まず手動でそれらを抽出し、Prismaクライアントクエリに渡す必要があります。リクエストボディのJSONの構造がPrismaクライアントが期待する構造と一致しないため、期待される構造を手動で作成する必要があります。

作業が終了したら、ファイルを保存して終了してください。

「次の手順でサーバーを再起動してください。」

  1. npx ts-node src/index.ts

 

新しいユーザーを作成するには、/user ルートを経由して、curlで以下のPOSTリクエストを送信することができます。

  1. curl -X POST -H “Content-Type: application/json” -d ‘{“name”:”Bob”, “email”:”bob@prisma.io”}’ http://localhost:3000/user

 

これによって、データベースに新しいユーザーが作成され、以下の出力が表示されます。

Output

{“id”:2,”email”:”bob@prisma.io”,”name”:”Bob”}

新しい投稿を作成するには、/postルートを介して次のPOSTリクエストをcurlで送信することができます。

  1. curl -X POST -H “Content-Type: application/json” -d ‘{“title”:”I am Bob”, “authorEmail”:”bob@prisma.io”}’ http://localhost:3000/post

 

これにより、データベースに新しい投稿が作成され、それが電子メールbob@prisma.ioのユーザーに接続されます。以下の出力が表示されます。

Output

{“id”:2,”title”:”I am Bob”,”content”:null,”published”:false,”authorId”:2}

最後に、PUTおよびDELETEのルートを実装します。開発サーバーを停止し、次のコマンドでindex.tsを開いてください。

  1. nano src/index.ts

 

次に、2つの POST ルートの実装に続いて、ハイライトされたコードを追加してください。

私のブログの場所は my-blog/src/index.ts です。
. . .

app.put('/post/publish/:id', async (req, res) => {
  const { id } = req.params
  const post = await prisma.post.update({
    where: { id: Number(id) },
    data: { published: true },
  })
  res.json(post)
})

app.delete(`/post/:id`, async (req, res) => {
  const { id } = req.params
  const post = await prisma.post.delete({
    where: { id: Number(id) },
  })
  res.json(post)
})

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

このコードは、1つのPUTリクエストと1つのDELETEリクエストのためのAPIルートを実装しています。

  • /post/publish/:id (PUT): Publishes a post by its ID.
  • /post/:id (DELETE): Deletes a post by its ID.

再度、両方の実装でPrismaクライアントが使用されています。/post/publish/:idのルートの実装では、公開する投稿のIDをURLから取得し、Prismaクライアントの更新クエリに渡します。データベースから投稿を削除する/post/:idのルートの実装も、URLから投稿のIDを取得し、Prismaクライアントの削除クエリに渡します。

ファイルを保存して終了してください。 (ファイルをほぞんしてしゅうりょうしてください。)

以下のコマンドを使ってサーバーを再起動してください。

  1. npx ts-node src/index.ts

 

次のcurlコマンドを使用して、PUTルートをテストすることができます。

  1. curl -X PUT http://localhost:3000/post/publish/2

 

このコマンドを実行すると、ID値が2の投稿が公開されます。もし/feedリクエストを再送信すると、この投稿はレスポンスに含まれるようになります。

最終的に、以下のcurlコマンドを使用してDELETEルートをテストすることができます。

  1. curl -X DELETE http://localhost:3000/post/1

 

次のcurlコマンドを使用して、ID値が1の投稿を削除するコマンドです。このIDの投稿が削除されたかどうかを確認するには、以下のcurlコマンドを使用して/post/1ルートへのGETリクエストを再送信してください。

  1. curl http://localhost:3000/post/1

 

このステップでは、ブログアプリケーションの残りのREST APIルートを実装しました。APIは今やさまざまなGET、POST、PUT、DELETEリクエストに応答し、データベース内のデータの読み書き機能を実装しています。

結論

この記事では、サンプルのブログアプリケーションのユーザーと投稿データを作成、読み取り、更新、削除するためのさまざまなルートを持つREST APIサーバーを作成しました。APIルート内では、Prismaクライアントを使用してデータベースに対応するクエリを送信しています。

次のステップとして、Prisma Migrateを使って追加のAPIルートを実装したり、データベーススキーマを拡張することができます。Prismaのドキュメントを訪れて、Prismaのさまざまな側面を学び、prisma-examplesリポジトリでGraphQLやgRPC APIなどのツールを使用した実行可能なサンプルプロジェクトを探索してみましょう。

コメントを残す 0

Your email address will not be published. Required fields are marked *


广告
広告は10秒後に閉じます。
bannerAds