本投稿は 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