🍏

Node.js + MySQLで作るREST API

2023/06/30に公開

RDBを使用したAPIを作ってみた

普段は、Firestoreを使ってるんですけど、開発現場の多くはMySQLやPostgreSQLを使っているので、モバイル用のAPIを過去に作ってたサンプルコードを参考に、mysql2のパッケージを使って作り直してみました。

こちらが完成品
https://github.com/sakurakotubaki/Node-REST-API

✅環境構築

環境構築の手順

  1. 📦プロジェクトを作成する
mkdir rest-api-mysql2
  1. 📦package.jsonファイルを作成
npm init -y
  1. 📦node.jsのフレームワークをインストールする
npm i express
  1. 📦mysqlと接続するパッケージをインストールする
npm install mysql2
  1. 📦corsのパッケージをインストールする
npm i cors
  1. 📦nodemonをインストールする
npm install -g nodemon

nodemon.jsonを作成して、index.jsを監視するファイルを作成する

{
  "watch": ["index.js"],
  "ext": "js",
  "ignore": ["node_modules"],
  "exec": "node index.js"
}
  1. MySQLにデータベースとテーブルを作成する
-- データベースの作成
CREATE DATABASE MyData;
-- データベースの切り替え
use MyData;

-- animalsテーブルの作成
CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

-- animalsテーブルにデータを挿入
INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

-- animalsテーブルのデータを表示
SELECT * FROM animals;

-- テーブルの各カラムの情報を表示します。
DESC animals;

-- EXIT または \qでMySQLを終了
  1. node.jsを起動するコマンド
nodemon

アプリのソースコード

index.js
const express = require("express");
const app = express();
const mysql = require("mysql2");
const cors = require("cors");
// corsを使うと、クロスオリジンのエラーが出なくなる
app.use(cors());
// express.json()を使うと、req.bodyを使えるようになる
app.use(express.json());

// MySQLの接続情報
const db = mysql.createConnection({
  user: "root",// 作成したユーザー名
  host: "localhost",// host名
  password: "1234",// 作成したユーザーのパスワード
  database: "MyData",// 作成したデータベース名
  port: 3306, // MySQLのデフォルトポート
});

// データの追加
app.post("/animals", (req, res) => {
  const name = req.body.name;

  const query = "INSERT INTO animals (name) VALUES (?)";
  db.query(query, [name], (err, result) => {
    if (err) {
      console.log(err);
      res.status(500).send({ error: "Error inserting data into database" });
    } else {
      res.status(200).json({ message: "Value Inserted" });
    }
  });
});


// データの取得
app.get("/animals", (req, res) => {
  const query = "SELECT * FROM animals";
  db.query(query, (err, result) => {
    if (err) {
      console.log(err);
      res.status(500).send("Error retrieving data from database");
    } else {
      res.status(200).json(result);
    }
  });
});

// データの更新
app.put("/animals/:id", (req, res) => {
  const id = req.params.id;
  const name = req.body.name;

  const query = "UPDATE animals SET name = ? WHERE id = ?";
  db.query(query, [name, id], (err, result) => {
    if (err) {
      console.log(err);
      res.status(500).send("Error updating data in database");
    } else {
      res.status(200).send("Value Updated");
    }
  });
});

// データの削除
app.delete("/animals/:id", (req, res) => {
  const id = req.params.id;

  const query = "DELETE FROM animals WHERE id = ?";
  db.query(query, [id], (err, result) => {
    if (err) {
      console.log(err);
      res.status(500).send("Error deleting data from database");
    } else {
      res.status(200).send("Value Deleted");
    }
  });
});
// サーバーの起動
const port = 3001;
app.listen(port, () => {
  console.log(`Yey, your server is running on port ${port}`);
});

エンドポイントへアクセスする

こちらのURLにアクセスすると、ブラウザにJSONのデータで、MySQLから取得したデータが表示されるはずです。POST, PUT, DELETEもしたので、表示されているデータの内容は少し違います。
http://localhost:3001/animals

ポストマンを使ってみる

デスクトップ版のポストマンというアプリを使用して、HTTP通信を行います。デスクトップ版はアカウントの登録をしなくても使えていました。

https://www.postman.com/

node.jsが起動しているときに、HTTP通信を行うと、MySQLのデータを操作することができるようになります。

まとめ

以前作っていたものを使いまわせると思っていたのですが、新しいパッケージに変えないと、MySQLと接続ができませんでした。今度はこれを使ってFlutterと通信をする実験をやってみたいなと思っております。

Discussion