著者は、 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/client
npm
パッケージから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。