Express.jsとMySQLの環境をDockerで立ち上げCRUD APIを作成する方法
Express.jsにおけるDockerを使ったExpress.jsとMySQLの環境構築する方法を解説します。
概要
Node.js ベースの Web フレームワークである Express.js のDockerを使ったExpress.jsとMySQLの環境構築する方法について解説します。
ここでは、以下バージョンを使用した、Express.jsの環境を構築する方法を説明します。
Express.js v4.18.1
nodejs v19.7.0
また、今回作成するコードは全て、GitHubに掲載しています。
なお本記事では、Dokcerを使用するため、 Dockerをインストールしてください。公式のDockerウェブサイトから、対応するオペレーティングシステムに合わせたDockerのインストーラーをダウンロードし、インストールを行ってください。
Dockerを使ったExpress.jsとMySQLの環境構築する方法
プロジェクトディレクトリの作成
まず、Express.jsプロジェクトとMySQLサーバーのために新しいディレクトリを作成します。コマンドラインで以下のコマンドを実行してください:
mkdir express-docker-mysql
プロジェクトディレクトリへの移動
プロジェクトディレクトリに移動します。以下のコマンドを実行してください:
cd express-docker-mysql
プロジェクトの初期化
Express.jsプロジェクトを初期化するために、以下のコマンドを実行します。
npm init -y
必要なパッケージのインストール
Express.jsを起動するために必要なパッケージをインストールします。
npm install express@4.18.1 mysql2
Docker Compose ファイルの作成
Docker Composeを使って、Express.jsアプリケーションとMySQLのDockerコンテナを一緒に起動するために、docker-compose.yml
という名前のファイルを作成し、以下の内容を追加します。
version: "3"
services:
app:
build: .
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
volumes:
db_data: # データを永続化するためのボリューム定義
データベースの初期化
MySQLサーバーを起動すると、docker-entrypoint-initdb.d
フォルダ内のSQLファイルが自動的に実行されます。このフォルダを作成し、init.sql
という名前のファイルを作成し、以下の内容を追加します。
CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE IF NOT EXISTS items (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
price FLOAT
);
Dockerfileの作成
Express.jsアプリケーションをDockerイメージとしてビルドするために、プロジェクトフォルダ内にDockerfile
という名前のファイルを作成し、以下の内容を追加します。
FROM node:19.7.0-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
アプリケーションの作成
Express.jsアプリケーションを作成します。プロジェクトディレクトリ内に新しいファイル(例: app.js
)を作成し、以下のコードを追加してください:
app.js
const express = require("express");
const mysql = require("mysql2");
const db = mysql.createPool({
host: "db",
user: "root",
password: "root",
database: "test",
});
const app = express();
app.use(express.json()); // For parsing application/json
// CREATE
app.post("/items", (req, res) => {
const { name, price } = req.body;
db.query(
"INSERT INTO items (name, price) VALUES (?, ?)",
[name, price],
(error, results) => {
if (error) throw error;
res.status(201).send(`Item added with ID: ${results.insertId}`);
}
);
});
// READ
app.get("/items", (req, res) => {
db.query("SELECT * FROM items", (error, results) => {
if (error) throw error;
res.send(results);
});
});
// UPDATE
app.put("/items/:id", (req, res) => {
const { name, price } = req.body;
db.query(
"UPDATE items SET name = ?, price = ? WHERE id = ?",
[name, price, req.params.id],
(error, results) => {
if (error) throw error;
res.send(`Item updated with ID: ${req.params.id}`);
}
);
});
// DELETE
app.delete("/items/:id", (req, res) => {
db.query(
"DELETE FROM items WHERE id = ?",
[req.params.id],
(error, results) => {
if (error) throw error;
res.send(`Item deleted with ID: ${req.params.id}`);
}
);
});
app.listen(3000, "0.0.0.0", () => {
console.log("サーバーがポート3000で起動しました");
});
Dockerイメージのビルドと実行
以下のコマンドを使用して、Docker Composeでアプリケーションとデータベースを起動します。
docker-compose up --build
これにより、Express.jsアプリケーションとMySQLサーバーがDockerコンテナ内で実行され、ホストのポート3000にマッピングされます。ブラウザやAPIテストツールなどから http://localhost:3000 にアクセスすることでExpress.jsアプリケーションにアクセスできます。
以上が、Dockerを使用してExpress.jsとMySQLの環境構築する手順です。Dockerを活用することで、環境構築の手間を減らし、開発プロセスをスムーズにすることができます。
注意: ホストのファイアウォールやネットワーク設定によっては、ポート3000へのアクセスが制限されている場合があります。必要に応じて、ファイアウォールやネットワーク設定を調整してください。
全ての作業が完了するとディレクトリ構造は以下のようになります。
express-docker-mysql
├── app.js
├── docker-compose.yml
├── Dockerfile
├── docker-entrypoint-initdb.d
│ └── init.sql
└── package.json
テスト
## CREATE(POSTリクエスト)のテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"Example Item","price":9.99}' http://localhost:3000/items
## READ(GETリクエスト)のテスト:
curl http://localhost:3000/items
## UPDATE(PUTリクエスト)のテスト
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Updated Item","price":14.99}' http://localhost:3000/items/1
## DELETE(DELETEリクエスト)のテスト
curl -X DELETE http://localhost:3000/items/1
これらのCURLコマンドを使用して、各エンドポイントの動作をテストすることができます。ただし、アプリケーションがポート3000で実行されていることを確認してください。また、必要に応じてホスト名やポート番号を変更してください。
まとめ
この記事では、Express.jsを使用してDatabaseを処理する方法を紹介しました。Express.jsを使用すると、簡単にデーターベースを使用した、REST APIを作成することができます。また、Dockerを使用することで、環境構築の手間を減らし、開発プロセスをスムーズにすることができます。