バックエンド開発

【Node.js + Express】ExpressでREST APIを開発してみる〜登録・更新・削除

【Node.js + Express】ExpressでREST APIを開発してみる〜登録・更新・削除

目次

  1. データベースにデータを登録するAPI
  2. データベースのデータを更新するAPI
  3. データベースのデータを削除するAPI
  4. まとめ

さて今回も、前回に引き続き、ExpressにてREST APIを開発してみようと思います。

本記事は下記記事の続きですので、下記記事から先にご覧になることをおすすめします。

【Node.js + Express】ExpressでREST APIを開発してみる〜概要・取得
https://www.dailyupblog.com/backend_development/1037/

前回は、REST APIの概要から作り方、データの取得、絞り込んで取得する方法までを紹介しました。

今回は、データベースのデータを登録・更新・削除する方法についてご紹介していきます。

それではいきましょう。

データベースにデータを登録するAPI

まず、データベースにデータを登録するAPIを作っていきます。

前回のデータを引き続き使います。

meibo.jsを開いて、下記を記述してください。

const express = require("express");
const router = express.Router();

const pool = require("../db/pool");

//データ全件取得API
router.get("/", function (req, res, next) {
  pool.query("SELECT * FROM meibo", function (error, result) {
    if (error) {
      throw error;
    }
    res.status(200).json({
      data: result.rows,
    });
  });
});

//データid検索API
router.get("/:id", function (req, res, next) {
  const id = req.params.id;
  pool.query("SELECT * FROM meibo where id = $1", [id], function (
    error,
    result
  ) {
    if (error) {
      throw error;
    }
    res.status(200).json({
      data: result.rows,
    });
  });
});

//データ登録API 追加
router.post("/", function (req, res, next) {
  const LENGTH = 10;
  const SOURCE = "abcdefghijklmnopqrstuvwxyz0123456789";
  let result = "";
  for (let i = 0; i < LENGTH; i++) {
    result += SOURCE[Math.floor(Math.random() * SOURCE.length)];
  }
  const { name, intro } = req.body.meibo_data;
  pool.query(
    "INSERT INTO meibo VALUES ($1, $2, $3)",
    [result, name, intro],
    function (error, results) {
      if (error) {
        res.status(500).json({
          status: "500 Internal Server Error",
          error: error,
        });
      }
      res.status(201).json({
        status: "success",
      });
    }
  );
});

module.exports = router;

今回はデータを送るPOSTですので、.post()で記述します。

今回、idのカラムには10桁のランダムな英数字が入るので、ランダムな文字列を生成するプログラムを書きます。

  const LENGTH = 10;
  const SOURCE = "abcdefghijklmnopqrstuvwxyz0123456789";
  let result = "";
  for (let i = 0; i < LENGTH; i++) {
    result += SOURCE[Math.floor(Math.random() * SOURCE.length)];
  }

上記で「abcdefghijklmnopqrstuvwxyz0123456789」を10桁でランダムに組み合わせます。

登録するデータはリクエストボディにjson形式で入れてPOSTします。

リクエストボディとは、Web APIなどでHTTP通信によってデータを送る際に、データを格納しておく場所のことです。

今回はこのリクエストボディ内に登録するデータを全て格納しておいて、送ります。

ですので、まずリクエストボディからデータを全て取得する必要があります。

それが下記の部分です。

const { name, intro } = req.body.meibo_data;

取ってきたリクエストボディはmeibo_dataという中にnameとintroの二つが入っているという形式ですので、上記のように書きます。

最後に.queryでSQLコマンドを実行して、データベースにデータを登録するところです。

GETの時と同じように第一引数にSQLコマンドを入れるのですが、今回は第二引数に登録データの値を入れます。そして、第3引数には関数を入れてGETの時と同様にエラー時の処理と、成功時の処理を書きます。

今回は成功した際には「success」という文字列をコンソールとして出力するようにしています。

  pool.query(
    "INSERT INTO meibo VALUES ($1, $2, $3)",
    [result, name, intro],
    function (error, results) {
      if (error) {
        res.status(500).json({
          status: "500 Internal Server Error",
          error: error,
        });
      }
      res.status(201).json({
        status: "success",
      });
    }
  );

さてここまでできたら、保存して、「npm start」でサーバーを起動しましょう。

そして、Postmanで下記のように入力してください。

POSTで「http://localhost:3000/meibo/」を入力し、その下のタブでBodyを選択して、下記のように入力してください。

{
    "meibo_data": {
            "name": "スティーブ",
            "intro": "26歳のエンジニアです。趣味は映画鑑賞です。"
    }
}

これで「Send」ボタンを押してください。

すると下記のように「success」のメッセージが表示されると思います。

さて成功したようです。

GETに変えて、全件データを取得してみましょう。

下記のように「スティーブ」のデータが登録されていれば成功です。

データベースのデータを更新するAPI

さて続いては、データを更新するAPIを作ってみます。

更新はGETでもPOSTでもなく「PUT」を使います。

まず、meibo.jsを開いて、下記を記述してください。

const express = require("express");
const router = express.Router();

const pool = require("../db/pool");

//データ全件取得API
router.get("/", function (req, res, next) {
  pool.query("SELECT * FROM meibo", function (error, result) {
    if (error) {
      throw error;
    }
    res.status(200).json({
      data: result.rows,
    });
  });
});

//データid検索API
router.get("/:id", function (req, res, next) {
  const id = req.params.id;
  pool.query("SELECT * FROM meibo where id = $1", [id], function (
    error,
    result
  ) {
    if (error) {
      throw error;
    }
    res.status(200).json({
      data: result.rows,
    });
  });
});

//データ登録API
router.post("/", function (req, res, next) {
  const LENGTH = 10;
  const SOURCE = "abcdefghijklmnopqrstuvwxyz0123456789";
  let result = "";
  for (let i = 0; i < LENGTH; i++) {
    result += SOURCE[Math.floor(Math.random() * SOURCE.length)];
  }
  const { name, intro } = req.body.meibo_data;
  pool.query(
    "INSERT INTO meibo VALUES ($1, $2, $3)",
    [result, name, intro],
    function (error, results) {
      if (error) {
        res.status(500).json({
          status: "500 Internal Server Error",
          error: error,
        });
      }
      res.status(201).json({
        status: "success",
      });
    }
  );
});

//データ更新API 追加
router.put("/:id", function (req, res, next) {
  const id = req.params.id;
  const { name, intro } = req.body.meibo_data;
  pool.query(
    "UPDATE meibo SET name = $1, intro = $2 WHERE id = $3",
    [name, intro, id],
    function (error, results) {
      if (error) {
        res.status(500),
          json({
            status: "500 Internal Server Error",
            error: error,
          });
      }
      if (results.rowCount === 0) {
        res.status(400).json({
          status: "400 Bad Request",
          message: "データが存在しません",
        });
      } else {
        res.status(200).json({
          status: "success",
        });
      }
    }
  );
});

module.exports = router;

登録APIの下に追記しました。

今回はパスパラメーターでidを送り、そのidカラムがパラメーターで送った値のデータに対して、リクエストボディに入れたデータに更新するという流れにします。

下記で、パラメータとリクエストボディの値を取得します。

  const id = req.params.id;
  const { name, intro } = req.body.meibo_data;

SQLコマンドは「update set」を使います。

whereで更新するデータをidで指定します。

データが見つからなかった際はステータス400で「データが存在しません」という文字列を出します。

成功した場合は「success」を返すようにしましょう。

  pool.query(
    "UPDATE meibo SET name = $1, intro = $2 WHERE id = $3",
    [name, intro, id],
    function (error, results) {
      if (error) {
        res.status(500),
          json({
            status: "500 Internal Server Error",
            error: error,
          });
      }
      if (results.rowCount === 0) {
        res.status(400).json({
          status: "400 Bad Request",
          message: "データが存在しません",
        });
      } else {
        res.status(200).json({
          status: "success",
        });
      }
    }
  );

さてこれで試してみましょう。

Postmanを開いて、下記のようにパスパラメータとリクエストボディにデータを入れましょう。

「ジェシカ」のデータを「エマ」に書き換えてみましょう。

URI入力欄の左のプルダウンでは「PUT」を選択しましょう。

これで「Send」ボタンを押しましょう。

すると「success」という文字列が表示されます。

その後、GETで「http://localhost:3000/meibo/」を入力して、前データを取得しましょう。

下記のように、「ジェシカ」のデータが「エマ」に更新されていれば、成功です。

データベースのデータを削除するAPI

最後にデータベースからデータを削除するAPIを作っていきましょう。

meibo.jsを開いて、下記のように記述してください。

const express = require("express");
const router = express.Router();

const pool = require("../db/pool");

//データ全件取得API
router.get("/", function (req, res, next) {
  pool.query("SELECT * FROM meibo", function (error, result) {
    if (error) {
      throw error;
    }
    res.status(200).json({
      data: result.rows,
    });
  });
});

//データid検索API
router.get("/:id", function (req, res, next) {
  const id = req.params.id;
  pool.query("SELECT * FROM meibo where id = $1", [id], function (
    error,
    result
  ) {
    if (error) {
      throw error;
    }
    res.status(200).json({
      data: result.rows,
    });
  });
});

//データ登録API
router.post("/", function (req, res, next) {
  const LENGTH = 10;
  const SOURCE = "abcdefghijklmnopqrstuvwxyz0123456789";
  let result = "";
  for (let i = 0; i < LENGTH; i++) {
    result += SOURCE[Math.floor(Math.random() * SOURCE.length)];
  }
  const { name, intro } = req.body.meibo_data;
  pool.query(
    "INSERT INTO meibo VALUES ($1, $2, $3)",
    [result, name, intro],
    function (error, results) {
      if (error) {
        res.status(500).json({
          status: "500 Internal Server Error",
          error: error,
        });
      }
      res.status(201).json({
        status: "success",
      });
    }
  );
});

//データ更新API
router.put("/:id", function (req, res, next) {
  const id = req.params.id;
  const { name, intro } = req.body.meibo_data;
  pool.query(
    "UPDATE meibo SET name = $1, intro = $2 WHERE id = $3",
    [name, intro, id],
    function (error, results) {
      if (error) {
        res.status(500),
          json({
            status: "500 Internal Server Error",
            error: error,
          });
      }
      if (results.rowCount === 0) {
        res.status(400).json({
          status: "400 Bad Request",
          message: "データが存在しません",
        });
      } else {
        res.status(200).json({
          status: "success",
        });
      }
    }
  );
});

//データ削除API 追加
router.delete("/:id", function (req, res, next) {
  const id = req.params.id;
  pool.query("DELETE FROM meibo WHERE id = $1", [id], function (
    error,
    results
  ) {
    if (error) {
      res.status(500),
        json({
          status: "500 Internal Server Error",
          error: error,
        });
    }
    if (results.rowCount === 0) {
      res.status(400).json({
        status: "400 Bad Request",
        message: "データが存在しません",
      });
    } else {
      res.status(200).json({
        status: "success",
        message: "データを削除しました。",
      });
    }
  });
});

module.exports = router;

更新APIの下に追記しました。

削除は「.delete()」を使います。

パスパラメーターでidを取得し、whereを使ってそのidと一致するデータを削除するという流れです。

下記でパラメーターを取得します。

const id = req.params.id;

そして、下記のようにデータを削除します。

  pool.query("DELETE FROM meibo WHERE id = $1", [id], function (
    error,
    results
  ) {
    if (error) {
      res.status(500),
        json({
          status: "500 Internal Server Error",
          error: error,
        });
    }
    if (results.rowCount === 0) {
      res.status(400).json({
        status: "400 Bad Request",
        message: "データが存在しません",
      });
    } else {
      res.status(200).json({
        status: "success",
        message: "データを削除しました。",
      });
    }
  });

query()の第一引数にはdeleteのSQLコマンドを入れて、第二引数にはパラメーターから取得したidを入れます。

第三引数には関数を入れて、その中にはエラーした際の処理、データが存在しなかった時の処理、成功した際の処理を記述します。

成功した際には「データを削除しました。」というメッセージを返します。

さて、下記のようにPostmanにて「http://localhost:3000/meibo/s79evqosp1」を実行してみましょう。

「スティーブ」のデータを削除してみましょう。

これで「Send」ボタンを実行して、「データを削除しました。」というメッセージが返ってきたら、成功です。

GETでデータを全件取得するAPIを実行して、確認してみましょう。

「スティーブ」のデータが消えているはずです。

まとめ

今回は、2回に分けて、ExpressでのREST APIの概要とデータの取得、絞り込み取得、登録、更新、削除のAPIの作り方を見てきました。

これらのAPIをクライアント側で叩けば、データベースでデータのやりとりができる簡単なアプリケーションの開発が可能になります。

また別記事でNuxt.jsにて、Expressで作ったAPIを叩くというのもやってみたいと思います。

それでは今回はここまで!

お疲れ様でした。

関連記事

関連記事