TypeScript と Prisma を使って、シンプルな API を作る

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