PrismaとPostgreSQLを使用してRESTAPIを構築する方法
著者は、 Diversity in Tech Fund を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Prisma は、Node.jsおよびTypeScript用のオープンソースORMです。 これは、3つの主要なツールで構成されています。
- Prisma Client :自動生成されたタイプセーフなクエリビルダー。
- Prisma Migrate :強力なデータモデリングおよび移行システム。
- Prisma Studio :データベース内のデータを表示および編集するためのGUI。
注:PrismaMigrateは現在プレビューにあります。 Prismaロードマップを介して開発をフォローできます。
これらのツールは、データベースワークフローにおけるアプリケーション開発者の生産性を向上させることを目的としています。 Prismaの最大の利点の1つは、それが提供する抽象化のレベルです。アプリケーション開発者は、複雑なSQLクエリやスキーマの移行を理解する代わりに、Prismaを使用するときにデータについてより直感的な方法で推論できます。
このチュートリアルでは、Prismaと PostgreSQL データベースを使用して、TypeScriptで小さなブログアプリケーション用のRESTAPIを構築します。 Docker を使用してPostgreSQLデータベースをローカルにセットアップし、Expressを使用してRESTAPIルートを実装します。 チュートリアルの最後に、さまざまなHTTPリクエストに応答し、データベース内のデータの読み取りと書き込みを行うことができるWebサーバーがマシン上でローカルに実行されるようになります。
前提条件
このチュートリアルでは、次のことを前提としています。
- Node.jsv10以降がマシンにインストールされています。 これを設定するには、OSのNode.jsのインストール方法とローカル開発環境の作成ガイドのいずれかを使用できます。
- Docker がマシンにインストールされています(PostgreSQLデータベースを実行するため)。 Docker Webサイトを介してmacOSおよびWindowsにインストールするか、Linuxディストリビューションの How To Install and UserDockerに従ってください。
TypeScriptおよびRESTAPIの基本的な知識は役立ちますが、このチュートリアルでは必須ではありません。
ステップ1—TypeScriptプロジェクトを作成する
このステップでは、npmを使用してプレーンなTypeScriptプロジェクトをセットアップします。 このプロジェクトは、このチュートリアルのコース全体で構築するRESTAPIの基盤になります。
まず、プロジェクトの新しいディレクトリを作成します。
mkdir my-blog
次に、ディレクトリに移動して、空のnpmプロジェクトを初期化します。 ここでの-yオプションは、コマンドの対話型プロンプトをスキップしていることを意味することに注意してください。 プロンプトを実行するには、コマンドから-yを削除します。
cd my-blog npm init -y
これらのプロンプトの詳細については、npmおよびpackage.jsonでNode.jsモジュールを使用する方法のステップ1に従うことができます。
デフォルトの応答が設定された状態で、次のような出力が表示されます。
OutputWrote 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セットアップに対して、次のコマンドを実行します。
npm install typescript ts-node @types/node --save-dev
これにより、プロジェクトに開発依存関係として3つのパッケージがインストールされます。
- typescript :TypeScriptツールチェーン。
- ts-node :JavaScriptに事前にコンパイルせずにTypeScriptアプリケーションを実行するためのパッケージ。
- @ types / node :Node.jsのTypeScriptタイプ定義。
最後に行うことは、 tsconfig.json ファイルを追加して、ビルドするアプリケーションに対してTypeScriptが適切に構成されていることを確認することです。
まず、次のコマンドを実行してファイルを作成します。
nano tsconfig.json
次のJSONコードをファイルに追加します。
my-blog / 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スキーマファイルを作成し、Dockerを使用してPostgreSQLをセットアップし、Prismaをそれに接続します。 Prismaスキーマは、Prismaセットアップのメイン構成ファイルであり、データベーススキーマが含まれています。
次のコマンドを使用して、PrismaCLIをインストールすることから始めます。
npm install @prisma/cli --save-dev
ベストプラクティスとして、(グローバルインストールではなく)プロジェクトにPrismaCLIをローカルにインストールすることをお勧めします。 これにより、マシンに複数のPrismaプロジェクトがある場合に、バージョンの競合を回避できます。
次に、Dockerを使用してPostgreSQLデータベースをセットアップします。 次のコマンドを使用して、新しいDockerComposeファイルを作成します。
nano docker-compose.yml
次に、新しく作成したファイルに次のコードを追加します。
my-blog / 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:
このDockerComposeファイルは、Dockerコンテナのポート5432を介してアクセスできるPostgreSQLデータベースを構成します。 また、データベースの資格情報は現在sammy(ユーザー)およびyour_password(パスワード)として設定されていることに注意してください。 これらのクレデンシャルは、ご希望のユーザーとパスワードに合わせて自由に調整してください。 ファイルを保存して終了します。
この設定が整ったら、次のコマンドを使用してPostgreSQLデータベースサーバーを起動します。
docker-compose up -d
このコマンドの出力は次のようになります。
OutputPulling 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
次のコマンドを使用して、データベースサーバーが実行されていることを確認できます。
docker ps
これにより、次のようなものが出力されます。
OutputCONTAINER 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セットアップを作成できます。 PrismaCLIから次のコマンドを実行します。
npx prisma init
これにより、次の出力が出力されます。
Output✔ Your Prisma schema was created at prisma/schema.prisma. You can now open it in your favorite editor.
ベストプラクティスとして、PrismaCLIのすべての呼び出しの前にnpxを付ける必要があることに注意してください。 これにより、ローカルインストールが使用されていることが保証されます。
コマンドを実行した後、PrismaCLIはプロジェクトにprismaという名前の新しいフォルダーを作成しました。 次の2つのファイルが含まれています。
schema.prisma:Prismaプロジェクトのメイン構成ファイル(データモデルが含まれます)。.env:データベース接続URLを定義するためのdotenvファイル。
Prismaがデータベースの場所を認識していることを確認するには、.envファイルを開き、DATABASE_URL環境変数を調整します。
まず、.envファイルを開きます。
nano prisma/.env
これで、環境変数を次のように設定できます。
my-blog / prisma / .env
DATABASE_URL="postgresql://sammy:your_password@localhost:5432/my-blog?schema=public"
データベースのクレデンシャルは、DockerComposeファイルで指定したものに変更してください。 接続URLの形式の詳細については、 Prismadocsにアクセスしてください。
完了したら、ファイルを保存して終了します。
このステップでは、Dockerを使用してPostgreSQLデータベースをセットアップし、Prisma CLIをインストールし、環境変数を介してPrismaをデータベースに接続します。 次のセクションでは、データモデルを定義し、データベーステーブルを作成します。
ステップ3—データモデルの定義とデータベーステーブルの作成
このステップでは、Prismaスキーマファイルでデータモデルを定義します。 次に、このデータモデルは Prisma Migrate を使用してデータベースにマップされます。これにより、データモデルに対応するテーブルを作成するためのSQLステートメントが生成および送信されます。 ブログアプリケーションを構築しているので、アプリケーションの主なエンティティはユーザーと投稿になります。
Prismaは、独自のデータモデリング言語を使用して、アプリケーションデータの形状を定義します。
まず、次のコマンドでschema.prismaファイルを開きます。
nano prisma/schema.prisma
次に、次のモデル定義を追加します。 モデルは、ファイルの下部、generator clientブロックの直後に配置できます。
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。 これは、1人のユーザーが多くの投稿に関連付けることができることを意味します。
これらのモデルを配置すると、PrismaMigrateを使用してデータベースに対応するテーブルを作成できるようになります。 ターミナルで次のコマンドを実行します。
npx prisma migrate dev --name "init" --preview-feature
このコマンドは、ファイルシステムに新しいSQL移行を作成し、それをデータベースに送信します。 コマンドに提供される2つのオプションの概要は次のとおりです。
--name "init":移行の名前を指定します(ファイルシステム上に作成された移行フォルダーに名前を付けるために使用されます)。--preview-feature:PrismaMigrateは現在プレビューにあるため必須です。
このコマンドの出力は次のようになります。
OutputEnvironment 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移行ファイルには、データベースに対して実行された次のステートメントが含まれています。
-- 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;
--create-onlyオプションをprisma migrate devコマンドに追加すると、生成されたSQL移行ファイルをカスタマイズすることもできます。たとえば、トリガーを設定したり、基盤となるデータベースの他の機能を使用したりできます。
このステップでは、Prismaスキーマでデータモデルを定義し、PrismaMigrateを使用してそれぞれのデータベーステーブルを作成しました。 次のステップでは、Prisma Clientをプロジェクトにインストールして、データベースにクエリを実行できるようにします。
ステップ4—プレーンスクリプトでのPrismaクライアントクエリの調査
Prisma Clientは、自動生成されたタイプセーフなクエリビルダーであり、Node.jsまたはTypeScriptアプリケーションからデータベース内のデータをプログラムで読み書きするために使用できます。 これをRESTAPIルート内のデータベースアクセスに使用し、従来のORM、プレーンSQLクエリ、カスタムデータアクセスレイヤー、またはデータベースと通信するその他の方法を置き換えます。
このステップでは、Prisma Clientをインストールし、PrismaClientで送信できるクエリについて理解します。 次のステップでRESTAPIのルートを実装する前に、まず、プレーンな実行可能スクリプトでPrismaClientクエリのいくつかを調べます。
まず、ターミナルを開いてPrisma Client npmパッケージをインストールすることにより、プロジェクトにPrismaClientをインストールします。
npm install @prisma/client
次に、ソースファイルを含むsrcという名前の新しいディレクトリを作成します。
mkdir src
次に、新しいディレクトリ内にTypeScriptファイルを作成します。
nano src/index.ts
すべてのPrismaClientクエリは、コードでawaitできるpromisesを返します。 これには、async関数内でクエリを送信する必要があります。
スクリプトで実行されるasync関数を使用して、次の定型文を追加します。
my-blog / src / 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())
ボイラープレートの簡単な内訳は次のとおりです。
- 以前にインストールした
@prisma/clientnpmパッケージからPrismaClientコンストラクターをインポートします。 - コンストラクターを呼び出して
PrismaClientをインスタンス化し、prismaというインスタンスを取得します。 - 次にPrismaClientクエリを追加する
mainというasync関数を定義します。 main関数を呼び出し、潜在的な例外をキャッチし、prisma.disconnect()を呼び出して、PrismaClientが開いているデータベース接続をすべて閉じるようにします。
main関数を配置すると、Prismaクライアントクエリをスクリプトに追加できるようになります。 index.tsを次のように調整します。
my-blog / src / index.ts
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const newUser = await prisma.user.create({
data: {
name: 'Alice',
email: '[email protected]',
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つのPrismaClientクエリを使用しています。
create:新しいUserレコードを作成します。 実際にはネストされた書き込みを使用していることに注意してください。つまり、同じクエリでUserとPostの両方のレコードを作成しています。findMany:データベースから既存のすべてのUserレコードを読み取ります。 各Userレコードに関連するPostレコードを追加でロードするincludeオプションを提供しています。
次に、次のコマンドを使用してスクリプトを実行します。
npx ts-node src/index.ts
端末に次の出力が表示されます。
OutputCreated new user: { id: 1, email: '[email protected]', name: 'Alice' }
[
{
id: 1,
email: '[email protected]',
name: 'Alice',
posts: [
{
id: 1,
title: 'Hello World',
content: null,
published: false,
authorId: 1
}
]
}
注:データベースGUIを使用している場合は、UserおよびPostテーブルを確認することでデータが作成されたことを検証できます。 または、npx prisma studioを実行して、PrismaStudioでデータを探索することもできます。
これで、PrismaClientを使用してデータベースのデータを読み書きできました。 残りの手順では、その新しい知識を適用して、サンプルのRESTAPIのルートを実装します。
ステップ5—最初のRESTAPIルートを実装する
このステップでは、アプリケーションにExpressをインストールします。 Expressは、このプロジェクトでRESTAPIルートを実装するために使用するNode.jsの一般的なWebフレームワークです。 実装する最初のルートでは、GETリクエストを使用してAPIからすべてのユーザーをフェッチできます。 ユーザーデータは、PrismaClientを使用してデータベースから取得されます。
先に進み、次のコマンドを使用してExpressをインストールします。
npm install express
TypeScriptを使用しているので、それぞれのタイプを開発の依存関係としてインストールすることもできます。 これを行うには、次のコマンドを実行します。
npm install @types/express --save-dev
依存関係が整ったら、Expressアプリケーションをセットアップできます。
メインソースファイルをもう一度開くことから始めます。
nano src/index.ts
次に、index.tsのすべてのコードを削除し、次のコードに置き換えて、RESTAPIを開始します。
my-blog / src / 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'),
)
コードの簡単な内訳は次のとおりです。
PrismaClientとexpressをそれぞれのnpmパッケージからインポートします。- コンストラクターを呼び出して
PrismaClientをインスタンス化し、prismaというインスタンスを取得します。 - Expressアプリを作成するには、
express()を呼び出します。 express.json()ミドルウェアを追加して、JSONデータをExpressで適切に処理できるようにします。- ポート
3000でサーバーを起動します。
これで、最初のルートを実装できます。 app.useとapp.listenの呼び出しの間に、次のコードを追加します。
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'),
)
追加したら、ファイルを保存して終了します。 次に、次のコマンドを使用してローカルWebサーバーを起動します。
npx ts-node src/index.ts
次の出力が表示されます。
OutputREST API server ready at: http://localhost:3000
/usersルートにアクセスするには、ブラウザで http:// localhost:3000 /usersまたはその他のHTTPクライアントを指定できます。
このチュートリアルでは、ターミナルベースのHTTPクライアントであるcurlを使用してすべてのRESTAPIルートをテストします。
注: GUIベースのHTTPクライアントを使用する場合は、PostwomanやAdvancedRESTClientなどの代替手段を使用できます。
ルートをテストするには、新しいターミナルウィンドウまたはタブを開いて(ローカルWebサーバーが実行を継続できるようにするため)、次のコマンドを実行します。
curl http://localhost:3000/users
前の手順で作成したUserデータを受け取ります。
Output[{"id":1,"email":"[email protected]","name":"Alice"}]
今回はpostsアレイは含まれていませんのでご注意ください。 これは、/usersルートの実装でincludeオプションをfindMany呼び出しに渡していないためです。
/usersで最初のRESTAPIルートを実装しました。 次のステップでは、残りのREST APIルートを実装して、APIに機能を追加します。
ステップ6—残りのRESTAPIルートを実装する
このステップでは、ブログアプリケーションの残りのRESTAPIルートを実装します。 最後に、WebサーバーはさまざまなGET、POST、PUT、およびDELETE要求を処理します。
実装するさまざまなルートの概要は次のとおりです。
| HTTPメソッド | ルート | 説明 |
|---|---|---|
GET
|
/feed
|
公開済みのすべての投稿を取得します。 |
GET
|
/post/:id
|
IDで特定の投稿を取得します。 |
POST
|
/user
|
新しいユーザーを作成します。 |
POST
|
/post
|
新しい投稿を作成します(ドラフトとして)。 |
PUT
|
/post/publish/:id
|
投稿のpublishedフィールドをtrueに設定します。
|
DELETE
|
post/:id
|
IDで投稿を削除します。 |
先に進み、残りのGETルートを最初に実装します。
次のコマンドでindex.tsを開きます。
nano src/index.ts
次に、/usersルートの実装に続いて、次のコードを追加します。
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.findOne({
where: { id: Number(id) },
})
res.json(post)
})
app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)
ファイルを保存して終了します。
このコードは、2つのGETリクエストのAPIルートを実装します。
/feed:公開された投稿のリストを返します。/post/:id:特定の投稿をIDで返します。
PrismaClientは両方の実装で使用されます。 /feedルートの実装では、Prisma Clientを使用して送信するクエリは、published列に値trueが含まれるすべてのPostレコードをフィルタリングします。 さらに、Prisma Clientクエリは、includeを使用して、返された各投稿に関連するauthor情報もフェッチします。 /post/:idルートの実装では、データベースから特定のPostレコードを読み取るために、URLのパスから取得されたIDを渡します。
サーバーがキーボードのCTRL+Cを押すのを止めることができます。 次に、以下を使用してサーバーを再起動します。
npx ts-node src/index.ts
/feedルートをテストするには、次のcurlコマンドを使用できます。
curl http://localhost:3000/feed
投稿はまだ公開されていないため、応答は空の配列です。
Output[]
/post/:idルートをテストするには、次のcurlコマンドを使用できます。
curl http://localhost:3000/post/1
これにより、最初に作成した投稿が返されます。
Output{"id":1,"title":"Hello World","content":null,"published":false,"authorId":1}
次に、2つのPOSTルートを実装します。 3つのGETルートの実装に従って、index.tsに次のコードを追加します。
my-blog / src / 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:データベースに新しいユーザーを作成します。/post:データベースに新しい投稿を作成します。
以前と同様に、Prismaクライアントは両方の実装で使用されます。 /userルートの実装では、HTTPリクエストの本文からPrismaクライアントcreateクエリに値を渡します。
/postルートはもう少し複雑です。ここでは、HTTPリクエストの本文から値を直接渡すことはできません。 代わりに、最初に手動で抽出して、PrismaClientクエリに渡す必要があります。 これは、リクエスト本文のJSONの構造が、Prisma Clientで期待される構造と一致しないため、期待される構造を手動で作成する必要があるためです。
CTRL+Cでサーバーを停止することにより、新しいルートをテストできます。 次に、以下を使用してサーバーを再起動します。
npx ts-node src/index.ts
/userルートを介して新しいユーザーを作成するには、curlを使用して次のPOSTリクエストを送信できます。
curl -X POST -H "Content-Type: application/json" -d '{"name":"Bob", "email":"[email protected]"}' http://localhost:3000/user
これにより、データベースに新しいユーザーが作成され、次の出力が出力されます。
Output{"id":2,"email":"[email protected]","name":"Bob"}
/postルートを介して新しい投稿を作成するには、curlを使用して次のPOSTリクエストを送信できます。
curl -X POST -H "Content-Type: application/json" -d '{"title":"I am Bob", "authorEmail":"[email protected]"}' http://localhost:3000/post
これにより、データベースに新しい投稿が作成され、メール[email protected]でユーザーに接続されます。 次の出力を出力します。
Output{"id":2,"title":"I am Bob","content":null,"published":false,"authorId":2}
最後に、PUTおよびDELETEルートを実装できます。
次のコマンドでindex.tsを開きます。
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):IDで投稿を公開します。/post/:id(DELETE):IDで投稿を削除します。
この場合も、PrismaClientは両方の実装で使用されます。 /post/publish/:idルートの実装では、公開される投稿のIDがURLから取得され、PrismaClientのupdateクエリに渡されます。 データベース内の投稿を削除する/post/:idルートの実装も、URLから投稿IDを取得し、それをPrismaClientのdeleteクエリに渡します。
繰り返しますが、キーボードのCTRL+Cでサーバーを停止します。 次に、以下を使用してサーバーを再起動します。
npx ts-node src/index.ts
次のcurlコマンドを使用して、PUTルートをテストできます。
curl -X PUT http://localhost:3000/post/publish/2
これにより、ID値が2の投稿が公開されます。 /feedリクエストを再送信すると、この投稿がレスポンスに含まれるようになります。
最後に、次のcurlコマンドを使用して、DELETEルートをテストできます。
curl -X DELETE http://localhost:3000/post/1
これにより、ID値が1の投稿が削除されます。 このIDの投稿が削除されたことを確認するには、GETリクエストを/post/1ルートに再送信します。
このステップでは、ブログアプリケーションの残りのRESTAPIルートを実装しました。 APIは、さまざまなGET、POST、PUT、およびDELETE要求に応答し、データベース内のデータを読み書きする機能を実装するようになりました。
結論
この記事では、サンプルのブログアプリケーションのユーザーデータと投稿データを作成、読み取り、更新、削除するためのさまざまなルートを使用して、RESTAPIサーバーを作成しました。 APIルート内では、Prismaクライアントを使用してそれぞれのクエリをデータベースに送信しています。
次のステップとして、Prisma Migrateを使用して、追加のAPIルートを実装するか、データベーススキーマを拡張できます。 必ずPrismaドキュメントにアクセスして、Prismaのさまざまな側面について学び、prisma-examplesリポジトリでなどのツールを使用してすぐに実行できるサンプルプロジェクトを調べてください。 GraphQLまたはgrPCAPI。