Fastifyでリクエストを取得と検証をする方法

概要

Fastifyでは、リクエストの処理はハンドラ関数内で行います。
ハンドラ関数の引数には、requestオブジェクトとreplyオブジェクトが渡されます。 これらのオブジェクトを使用して、リクエストに関連するデータの取得やレスポンスの生成などを行います。

ここでは、以下バージョンを使用した、Fastifyでリクエスト処理する方法を説明します。

Fastify v4.0.0
nodejs v19.7.0

また、今回作成するコードは全て、以下に掲載しています。 https://github.com/wiblok/Fastify

リクエスト情報を取得する方法

リクエストに関する情報を取得するには、リクエストオブジェクトを使用します。 リクエストオブジェクトは、クライアントからのリクエストに関する情報を格納しています。Fastifyのルートハンドラ内で使用され、リクエストヘッダー、パラメータ、ペイロードなどのデータにアクセスするために利用されます。

以下のサンプルコードは、Fastifyでリクエストオブジェクトを理解するための例です。GETリクエストを受け取り、リクエストヘッダー、クエリパラメータ、ボディデータにアクセスして、それらの値を含むレスポンスを返します。

request.js

const fastify = require("fastify")();

fastify.get("/", async (request, reply) => {
  // リクエストヘッダーの取得
  const headers = request.headers;

  // クエリパラメータの取得
  const queryParam = request.query.param;

  // ボディデータの取得
  const body = request.body;

  const response = {
    headers: headers,
    queryParam: queryParam,
    body: body,
  };

  return response;
});

fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    console.error("サーバーの起動中にエラーが発生しました:", err);
    process.exit(1);
  }
  console.log("サーバーがポート3000で起動しました");
});

解説

  • Fastifyのインスタンスを作成
const fastify = require("fastify")();

Fastifyモジュールをインポートし、そのインスタンスを作成します。

  • GETリクエストのハンドリングとリクエストデータの取得:
fastify.get("/", async (request, reply) => {
  // リクエストヘッダーの取得
  const headers = request.headers;

  // クエリパラメータの取得
  const queryParam = request.query.param;

  // ボディデータの取得
  const body = request.body;

  const response = {
    headers: headers,
    queryParam: queryParam,
    body: body,
  };

  return response;
});

/というパスへのGETリクエストをハンドリングします。リクエストが来ると、リクエストヘッダー、クエリパラメータ、ボディデータを取得し、それらを含むオブジェクトをレスポンスとして返します。

  • サーバーの起動
fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    console.error("サーバーの起動中にエラーが発生しました:", err);
    process.exit(1);
  }
  console.log("サーバーがポート3000で起動しました");
});

Fastifyのインスタンスをポート3000でリッスンさせ、サーバーを起動します。もし何らかのエラーが発生した場合は、エラーメッセージをコンソールに出力し、プロセスを終了します。エラーがなければ、“サーバーがポート3000で起動しました"というメッセージをコンソールに出力します。

テスト

curl http://localhost:3000

リクエスト情報の検証する方法

Fastifyでリクエストのバリデーションを簡単に行うことでができます。

この例では、/usersエンドポイントにPOSTリクエストが送信された際に、nameとageのフィールドが必須であり、ageは数値であることを検証します。

validate.js

const fastify = require("fastify")();

fastify.post(
  "/users",
  {
    schema: {
      body: {
        type: "object",
        properties: {
          name: { type: "string" },
          age: { type: "number" },
        },
        required: ["name", "age"],
      },
    },
  },
  async (request, reply) => {
    const { name, age } = request.body;

    // バリデーションが成功した場合の処理
    reply.send({ message: "User created successfully", name, age });
  }
);

fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  console.log("Server is running on port 3000");
});

解説

  • Fastifyのインスタンスを作成
const fastify = require("fastify")();

Fastifyモジュールをインポートし、そのインスタンスを作成します。

  • POSTリクエストのハンドリングとリクエストデータのバリデーション:
fastify.post(
  "/users",
  {
    schema: {
      body: {
        type: "object",
        properties: {
          name: { type: "string" },
          age: { type: "number" },
        },
        required: ["name", "age"],
      },
    },
  },
  async (request, reply) => {
    const { name, age } = request.body;

    // バリデーションが成功した場合の処理
    reply.send({ message: "User created successfully", name, age });
  }
);

/usersというパスへのPOSTリクエストをハンドリングします。リクエストが来ると、リクエストボディのバリデーションを行います。バリデーションは、リクエストボディがオブジェクトであり、nameプロパティが文字列、ageプロパティが数値であることを要求します。これらのプロパティは必須です。バリデーションが成功した場合、成功メッセージとともにユーザーの名前と年齢をレスポンスとして返します。

  • サーバーの起動
fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  console.log("Server is running on port 3000");
});

Fastifyのインスタンスをポート3000でリッスンさせ、サーバーを起動します。もし何らかのエラーが発生した場合は、エラーメッセージをコンソールに出力し、プロセスを終了します。エラーがなければ、“Server is running on port 3000"というメッセージをコンソールに出力します。

テスト

# 正常なリクエストのテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"John", "age": 25}' http://localhost:3000/users
# バリデーションエラーが発生するリクエストのテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"John"}' http://localhost:3000/users

まとめ

リクエストオブジェクトを使用することで、以下のことが可能になります:

リクエストオブジェクトを使用することで:

  • リクエストヘッダーやクエリパラメータなどのリクエストデータにアクセスできます。
  • リクエストのパスパラメータやボディデータなど、リクエストの異なる部分のデータを取得できます。
  • 認証トークンやセッション情報など、リクエストに関連する認証や認可の情報を取得できます。
  • ミドルウェア関数を使用して、リクエストデータのバリデーションや変換を行うことができます。

リクエストオブジェクトを使用することで、リクエストのデータによる様々な操作を行うことができます。 リクエストオブジェクトには、多くのプロパティやメソッドがあり、高度なカスタマイズや制御が可能です。