【第1回】Express × Prisma × PostgreSQL|バックエンド環境を作ろう

プログラミング
スポンサーリンク

皆さん明けましておめでとうございます。キジです。
今回はタイトル通り、「Express」×「Prisma」×「PostgreSQL」 を使ったバックエンド側に関する記事を記載します。

メインはPrismaで、それをExpress、PostgreSQLと紐付ける際にどうすればよいかなどを連載して行きます。

最初である今回は、主に環境を作っていきます。PrismaでDBのテーブルを作成し、Express経由でデータを登録できるところまでを記載します。

本記事は、node.js、TypeScript、RDBに関する知識がある程度あることを前提とします。

環境整理

Prismaはnode.jsで実行されるライブラリです。npm、yarnどちらでも良いと思います。本記事では、npmを使って環境を作成します。

また、実行環境はDockerを用いて実行します。Dockerについて詳しく知りたい方はこちらを参照してください。
※ 準備中

$ npm --version
9.2.0
$ node --version
v19.3.0

プロジェクト作成

node.js・TypeScript環境の構築

$ npm init
# 適当にEnter
# package.jsonファイルが作成されればとりあえずOK

$ npm i typescript @types/node ts-node
$ npx tsc --init
# tsconfig.jsonファイルが作成されればOK

tsconfig.json

    ・・・
    "types": ["node"],    // コメントアウトを外して追記
    ・・・

index.ts

console.log('Hello 第1回Express × Prisma × PostgreSQL バックエンド環境を作ろう');

DockerFileの作成

Prismaを起動するための環境をDockerで用意します。

DockerFile

FROM node:19
WORKDIR /app

COPY ./ ./
RUN npm i

CMD [ "npx", "ts-node", "index.ts" ]

.dockerignore

/node_modules

docker-compose.yml

version: '3'
services:
### バックエンド ###
  prisma_server:
    container_name: prisma_server
    build: ./
    volumes:
      - ./src:/app/src
      - ./prisma:/app/prisma
    ports:
        - 4200:4200
    networks:
      backend:
        ipv4_address: 192.168.100.10
    depends_on:
      - "db"
    tty: true

### データベース ###
  db:
    container_name: db
    image: postgres:latest
    restart: always
    networks:
      backend:
        ipv4_address: 192.168.100.252
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: prisma_db
    volumes:
      - ./db/data/:/var/lib/postgresql/data/

### ネットワーク構成 ###
networks:
  backend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.100.0/24

この時点では、以下のようなディレクトリ構成となっています。

/db
/node_modules
.dockerignore
docker-compose.yml
Dockerfile
index.ts
package.json
package-lock.json
tsconfig.json

動作確認

DockerComposeを起動して動作するか確認します。

$ docker compose up -d

Prismaの構築

それでは、ExpressとPrismaを使えるように準備します。
まずは、以下のコマンドから、ライブラリをインストールします。

$ npm i express @types/express prisma @prisma/client

Prismaでテーブルを作成する

まずは、Prismaの設定を行います。ライブラリをインストールすると、prismaコマンドが使えるようになります。

以下のコマンドで、prismaの初期設定を行います。

$ npx prisma init
# 以下の2つのファイルが作成される
# prisma/schema.prisma
# .env

データベースの接続には「DATABASE_URL」の環境変数にDBの接続先を設定します。
.envファイルでも良いのですが、Dockerfileの中で環境変数を定義してしまいます。

Dockerfileに以下を追加してください。

WORKDIR /app
ENV DATABASE_URL postgresql://admin:admin@192.168.100.252:5432/prisma_db   ・・・ 追記

Prismaでは、schema.prismaファイルの中でDBに関する定義を書いていきます。
modelがテーブル定義になり、Expressで使う型にもなります。

prisma/schema.prisma

// ==== ここから ====
generator client {
    provider = "prisma-client-js"
}
datasource db {
    provider = "postgresql"
    url      = env("DATABASE_URL")
}
// ==== ここまではお決まり ====

model User {
    id Int @id @default(autoincrement())
    name String? @db.VarChar(30)
    @@map("users")
}

上記の修正が完了したら、以下のコマンドを実行します。

$ export DATABASE_URL=postgresql://admin:admin@localhost:5432/prisma_db
# ローカルで実行する場合、環境変数がないため失敗する
# コンテナにアタッチして実行する場合は、不要

$ npx prisma migrate dev init
# 新しく作るか?と聞かれるので、Enterを押す

問題ない場合、以下のファイルが作成されて、テーブルが作られる。

./prisma/migrations/yyyyMMddhhmmss_init/migration.sql

ここではprismaコマンドについては深く記載しません。migrationファイルが作られて、DBが更新されるんだなと認識してください。

migrationコマンドを打つ度に変更を自動で検出して、必要なSQLを実行してくれます。

詳細については、以下の記事を参照してください。
※ 準備中

Prisma Studioでテーブルを確認する

実際にテーブルが作られていることを確認します。
DBクライアントがある方は、それを使って確認していただいて問題ありません。

ここでは、Prismaから提供されている、「Prisma Studio」を使って確認します。以下のコマンドを実行します。

$ npx prisma studio
# localhost:5555でサーバーが立ち上がる

サーバーが立ち上がったら、ブラウザで確認してみましょう。Userモデルが表示されていればOKです。

Prisma Studio モデル一覧

Expressの構築

最後はExpressでAPIを構築します。

index.ts

import express, { Request, Response } from "express";
const app = express();
const port = process.env.PORT || 4200;

app.use(express.json());

// === Prismaの設定 ===
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

// === APIの設定 ===
app.post("/users", (req: Request, res: Response)  => {
    const {name} = req.body;
    prisma.user.create({data: {name}}).then(newUser => {

        res.status(200).send(newUser);
    }).catch(e => {
        res.status(401).send(e);
    })
});
app.listen(port, () => {
    console.log(`listen port ${port}`);
});

それでは、Dockerイメージを作り直して、再実行します。「listen port 4200」のログが出ていたらOKです。
「localhost:4200/users」に対して、リクエストを送ってみます。

ここでは、curlコマンドをローカルで実行してみます。

$ curl -X POST http://localhost:4200/users -H "Content-Type: application/json" -d '{"name" : "太郎"}'
# {"id": 1, "name" : "太郎" } ・・・ が返却されることを確認

上記を確認できたら、DBを確認してみましょう。
太郎のレコードが作成されていればOKです!

Prisma Studio Userモデルレコード

まとめ

本記事はここまでです!Express、Prisma、PostgreSQLを使って、APIからDB接続、データ登録まで行いました。
次回はPrismaコマンドについて詳しく見ていきたいと思います。
よかったらTwitterのフォローなどよろしくおねがいします!

コメント

タイトルとURLをコピーしました