本投稿は TECOTEC Advent Calendar 2022 の7日目の記事です。 こんにちは!次世代デジタル基盤開発事業部の原田です。 今回は、TypeScriptとPrismaを使って、シンプルなAPIを作成したいと思います。
やりたいこと
データベースからデータを作成、取得するAPIを作ります。初心者にとってデータベースを扱うことは難しいですが、Prismaを活用することで、直感的にデータベースの構築や、データの作成、取得ができます。
セットアップ
APIを作成する前に、TypeScriptでプロジェクトを作成、Prismaでのモデルの作成や、マイグレーションの実行が必要になります。小難しく聞こえますが、公式のクイックスタートを参考にしてもらえれば、問題なくできると思います。 www.prisma.io
スキーマファイルを作成
今回は公式のPrismaスキーマを用いて、POSTとGETメソッドを作成します。 POSTでは画面から情報を送信する、GETでは画面表示のために情報を取得するイメージです。
model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? published Boolean @default(false) author User @relation(fields: [authorId], references: [id]) authorId Int }
POSTメソッド
POSTのメソッドでは、名前とメールアドレスからユーザーを登録するメソッドを作成します。 今回は割愛しますが、フロント側からインプットされた値を渡し、データベースに登録することも可能です。
Handlerファイル
ユーザー登録のメソッドでは、リクエスト(要求)を受け取り、そのデータからユーザーを作成し、レスポンス(応答)を返す必要があります。 データからユーザーを作成する際に、Prismaを用いることで、直感的にコーディングできます。
import express, { Request, Response } from 'express'; const userPostHandler = async (req: Request, res: Response) => { const params = { name: req.body.name, email: req.body.email, }; const user = await UserController.createUser(user.id); app.post("/user/register", (req, res) => { res.status(200).send(user); });
Controllerファイル
このcreateメソッドでは、データを登録できます。他にもfind、update、deleteメソッドを使えば、データの検索、更新、削除も可能です。
type UserParams = { name: string; email: string; } export async function createUser(params: UserParams): Promise<User> { const user = await prisma.tbl_user.create({ data: { name: params.name, email: params.email, }, }); return user; }
GETメソッド
GETのメソッドでは、ユーザーのIDを元に投稿したデータを取得します。SQLのように条件を指定することで、ユーザーに関連する投稿を取得できます。
Handlerファイル
ユーザーのIDを受け取り、関連する投稿の情報を返しています。
import express, { Request, Response } from 'express'; const postsGetHandler = async (req: Request, res: Response) => { const posts = await PostController.getPostList(user.id); app.post("/user/register", (req, res) => { res.status(200).send(posts); });
Controllerファイル
指定されたユーザーの全投稿を取得します。またクエリの内容を変えることで、一覧の並べ替え、取得する項目やレコード数の指定、紐づいたレコードの取得、紐づいているレコードの取得も可能です。
export async function getPostList(userId: number): Promise<Post> { const posts = await prisma.tbl_post.findMany({ where: { userId: authorId }, }); if (posts.length === 0) { throw new NotFoundError('ユーザーの投稿が見つかりませんでした'); } return posts; }
おわりに
いかがでしたでしょうか。 このようにデータベースの知識がなくても、Prismaを使うことで、データベースを操作するAPIを作成することができます。 少しでも参考になれば幸いです。最後まで読んでいただきありがとうございました。 www.tecotec.co.jp