皆さん明けましておめでとうございます。キジです。
今回はタイトル通り、「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です。
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です!
まとめ
本記事はここまでです!Express、Prisma、PostgreSQLを使って、APIからDB接続、データ登録まで行いました。
次回はPrismaコマンドについて詳しく見ていきたいと思います。
よかったらTwitterのフォローなどよろしくおねがいします!
コメント