現役エンジニアがNode.jsを解説! 〜Node.jsでMySQLを使う〜

公開日:2022-09-18
JavaScript
Node.js

https://www.youtube.com/watch?v=x85DgYYbTAs

この講座はYouTubeで動画形式でも用意しています。合わせてご覧ください。

目的

Node.jsでMySQLを使う。

データベースについて

データの整理や収集を行い保存するシステムです。特にデータをテーブルとして扱って関係(リレーション)を持たせることができるデータベースである「リレーショナルデータベース(RDBMS)」は、WEB開発で多く利用されています。
RDBMSでは、SQLと呼ばれるデータベース言語を使用して、データを操作します。有名なRDBMSに「MySQL」「PostgreSQL」「Oracle Database」「SQL Server」などがあるが、今回は特に人気の「MySQL」を扱います。
以下のサイトも参考にしてみてください。

https://developer.mozilla.org/ja/docs/Glossary/Databasehttps://developer.mozilla.org/ja/docs/Glossary/Database

https://expressjs.com/ja/guide/database-integration.htmlhttps://expressjs.com/ja/guide/database-integration.html

データベースの準備

今回はDockerで開発用のMySQLをローカル環境に用意します。

https://hub.docker.com/_/mysqlhttps://hub.docker.com/_/mysql

DockerでMySQLを立ち上げる際に設定を書いたファイルがdocker-compose.ymlです。

version: '3.1'

services:
  db:
    image: mysql:8
    platform: linux/amd64
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: db
      TZ: Asia/Tokyo
    ports:
    - 3306:3306

Dockerのコマンドを使ってMySQLの立ち上げ。

docker-compose up -d

立ち上がったデータベースにアクセスできるか試すためにMySQLクライアントからデータベースに接続します。
今回はTablePlusというツールでアクセスします。

今回はdocker-compose.ymlの中にMYSQL_ROOT_PASSWORD: example,MYSQL_DATABASE: dbのようにパスワードとデータベース名が記載されています。
それら接続設定をこちらに記入します。

TablePlus画像

今回は具体的な例としてTODOアプリを想定したtodoテーブルを作成します。

CREATE TABLE `todo` (
  `id` int NOT NULL AUTO_INCREMENT,
  `status` int NOT NULL,
  `task` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

テーブルについて説明します。

  • idにはAUTO_INCREMENT(自動採番)を設定しているのでデータが追加されるとIDが自動で割り振られる
  • statusでTODOの完了、未完了の状態を1や2の数字を用いて扱うためintを設定
  • taskでタスクの内容を文字列として扱えるようvarcherで文字列の255字までを扱う型を設定
  • created_atdeleted_atで作成日、削除日を取得できるように

Node.jsからMySQLに接続する

MySQLパッケージのインストール

yarn add mysql

https://github.com/mysqljs/mysqlhttps://github.com/mysqljs/mysql

データベースへの接続処理を実装

const mysql = require("mysql");

const connection = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  database: "db",
  // 本番環境では環境変数を使うようにする
  password: "example",
});

connection.connect((err) => {
  if (err) {
    console.log("error connecting: " + err.stack);
    return;
  }
  console.log("success");
});

const mysql = require("mysql")ではMySQLパッケージを読み込んでいます。
const connection = mysql.createConnectionというメソッドでデータベースへの接続を実装していきます。

今回は学習のためコードにパスワードを記載していますが、実際の本番コードではセキュリティのために環境変数を用います。

createConnectionに設定情報を渡すことで接続ができてconnectionという変数が作成されます。
connectionを使ってconnectメソッドを実行するとデータベースへの接続が行われます。

GETリクエスト時にtodoテーブルを取得するAPIを実装

GETリクエストでパスが /todo にアクセスすると、connection変数のqueryメソッドを使って、データベースからデータを取得するSQLを実行します。

app.get("/todo", (req, res) => {
  connection.query("SELECT * FROM todo", (error, results) => {
    if (error) {
      console.log(error);
      res.status(500).send("error");
      return;
    }
    console.log(results);
    res.json(results);
  });
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

これでtodoのGETのAPIが一通り完成です。

まとめ

次回は登録や更新など、CRUDと呼ばれるAPIの実装について解説します。