爆速のNode.jsフレームワークでCRUD APIを構築する!

概要

Fastify は高速な Node.js の Web フレームワークです。 TODO アプリケーションを作成するために、Fastify を使用して API を構築してみます。

今回作成する API は以下の通りです。

  1. GET /todos すべての TODO を取得する

  2. POST /todos 新しい TODO を作成する

  3. PUT /todos/:id 既存の TODO を更新する

  4. DELETE /todos/:id 既存の TODO を削除する

環境

Fastify v4.0.0
Node v19.7.0

作成したソースコードの全容

// モジュールをインポートします
const fastify = require("fastify")({ logger: true });

// 一覧用の Todo を作成します
let todos = [
  { id: 1, text: "野球をする", completed: false },
  { id: 2, text: "ゲームをする", completed: false },
  { id: 3, text: "仕事をする", completed: false },
];

// '/todos'パスで Todo の一覧を取得します
fastify.get("/todos", async (request, reply) => {
  return { todos };
});

// "/todos"パスに POST リクエストを送信して Todo を新しく作成します
fastify.post("/todos", async (request, reply) => {
  const newTodo = request.body;
  newTodo.id = todos.length + 1;
  todos.push(newTodo);
  return { todo: newTodo };
});

// "/todos/:id"パスに PUT リクエストを送信して Todo を更新します
fastify.put("/todos/:id", async (request, reply) => {
  const id = request.params.id;
  let todo = todos.find((t) => t.id == id);
  if (todo) {
    todo = { ...todo, ...request.body };
    return { todo };
  } else {
    reply.status(404).send({ message: "Todo が見つかりません" });
  }
});

// "/todos/:id"パスに DELETE リクエストを送信して Todo を削除します
fastify.delete("/todos/:id", async (request, reply) => {
  const id = request.params.id;
  const index = todos.findIndex((t) => t.id == id);
  if (index !== -1) {
    todos.splice(index, 1);
    return { message: "Todo が削除されました" };
  } else {
    reply.status(404).send({ message: "Todo が見つかりません" });
  }
});

// ポート 3000 番でサーバーをリッスンします
fastify.listen(3000, (err, address) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
  fastify.log.info(`サーバーが${address}でリッスン中です`);
});

解説

const fastify = require("fastify")({ logger: true });

上記のコードは Fastify をインストールし、ログを有効にする設定をしています。

let todos = [
  { id: 1, text: "野球をする", completed: false },
  { id: 2, text: "ゲームをする", completed: false },
  { id: 3, text: "仕事をする", completed: false },
];

上記のコードは、API が返す TODO のデータを配列として定義しています。

fastify.get("/todos", async (request, reply) => {
  return { todos };
});

上記のコードは、/todos に GET リクエストが送信された場合、todos の配列をレスポンスとして返す処理を行います。Fastify では、request オブジェクトを通じてリクエスト情報にアクセスすることができます。上記のコードでは、request オブジェクトは使われていません。

fastify.post("/todos", async (request, reply) => {
  const newTodo = request.body;
  newTodo.id = todos.length + 1;
  todos.push(newTodo);
  return { todo: newTodo };
});

上記のコードは、/todos に POST リクエストが送信された場合、request.body に含まれる新しい TODO を todos の配列に追加し、新しく追加された TODO をレスポンスとして返す処理を行います。request.body は、リクエストボディのデータを含むオブジェクトです。

fastify.put("/todos/:id", async (request, reply) => {
  const id = request.params.id;
  let todo = todos.find((t) => t.id == id);
  if (todo) {
    todo = { ...todo, ...request.body };
    return { todo };
  } else {
    reply.status(404).send({ message: "Todo が見つかりません" });
  }
});

上記のコードは、/todos/:id に PUT リクエストが送信された場合、指定された ID の TODO を request.body に含まれるデータで更新し、更新後の TODO をレスポンスとして返す処理を行います。request.params オブジェクトは、リクエストの URL に含まれるパラメータを含みます。

fastify.delete("/todos/:id", async (request, reply) => {
  const id = request.params.id;
  const index = todos.findIndex((t) => t.id == id);
  if (index !== -1) {
    todos.splice(index, 1);
    return { message: "Todo が削除されました" };
  } else {
    reply.status(404).send({ message: "Todo が見つかりません" });
  }
});

上記のコードは、/todos/:id に DELETE リクエストが送信された場合、指定された ID の TODO を todos から削除し、削除の成功メッセージをレスポンスとして返す処理を行います。

fastify.listen(3000, (err, address) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
  fastify.log.info(\`サーバーが${address}でリッスン中です\`);
});

上記のコードは、3000 番ポートで API を起動し、‘0.0.0.0’のアドレスでリスニングするように設定しています。

終わりに

本記事では、Fastify を使用して TODO アプリ用の API を構築する方法を紹介しました。GitHub には、本記事で紹介したソースコードを公開していますので、ぜひダウンロードしてお試しください。

https://github.com/wiblok/Fastify