現役エンジニアがNode.jsを解説! 〜Node.jsでMySQLを使う〜
この講座はYouTubeで動画形式でも用意しています。合わせてご覧ください。
目的
Node.jsでMySQLを使う。
データベースについて
データの整理や収集を行い保存するシステムです。特にデータをテーブルとして扱って関係(リレーション)を持たせることができるデータベースである「リレーショナルデータベース(RDBMS)」は、WEB開発で多く利用されています。
RDBMSでは、SQLと呼ばれるデータベース言語を使用して、データを操作します。有名なRDBMSに「MySQL」「PostgreSQL」「Oracle Database」「SQL Server」などがあるが、今回は特に人気の「MySQL」を扱います。
以下のサイトも参考にしてみてください。
https://developer.mozilla.org/ja/docs/Glossary/Database
https://expressjs.com/ja/guide/database-integration.html
データベースの準備
今回はDockerで開発用のMySQLをローカル環境に用意します。
https://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
のようにパスワードとデータベース名が記載されています。
それら接続設定をこちらに記入します。
今回は具体的な例として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_at
、deleted_at
で作成日、削除日を取得できるように
Node.jsからMySQLに接続する
MySQLパッケージのインストール
yarn add mysql
https://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の実装について解説します。