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を使用することで、環境構築の手間を減らし、開発プロセスをスムーズにすることができます。