Fastifyでレスポンス情報を編集する方法

Fastifyでレスポンス情報を修正する方法を紹介します。コードもGit Hubに掲載するので参考にしてください。

概要

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

ここでは、以下バージョンを使用した、Fastifyでレスポンス情報を修正する方法を説明します。

Fastify v4.0.0
nodejs v19.7.0

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

レスポンス情報を編集する方法

レスポンスオブジェクトは、クライアントへのレスポンスを構築するために使用されます。 fastifyのルートハンドラ内で利用され、レスポンスのヘッダー、ステータスコード、データなどを設定するために利用されます。

以下のサンプルコードは、Fastifyでレスポンスオブジェクト(replyオブジェクト)を理解するための例です。GETリクエストを受け取り、異なる種類のレスポンスを生成して返します。

response.js

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

fastify.get("/", async (request, reply) => {
  // JSONレスポンスの生成
  const jsonResponse = {
    message: "This is a JSON response",
  };
  reply.send(jsonResponse);
  // HTMLレスポンスの生成
  const htmlResponse = "<h1>This is an HTML response</h1>";
  reply.type("text/html").send(htmlResponse);
  // レスポンスヘッダーの設定
  reply.header("Custom-Header", "Custom Value");
  // ステータスコードの設定
  reply.status(201).send("Created");
  // リダイレクトの実行
  reply.redirect("/new-location");
  // エラーレスポンスの生成
  const errorResponse = {
    error: "An error occurred",
  };
  reply.status(500).send(errorResponse);
});

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

解説

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

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

  • JSONレスポンスの生成
fastify.get("/json", async (request, reply) => {
  const jsonResponse = {
    message: "This is a JSON response",
  };
  reply.send(jsonResponse);
});

/jsonというパスへのGETリクエストをハンドリングします。リクエストが来ると、JSON形式のレスポンスを生成して返します。

  • HTMLレスポンスの生成
fastify.get("/html", async (request, reply) => {
  const htmlResponse = "<h1>This is an HTML response</h1>";
  reply.type("text/html").send(htmlResponse);
});

/htmlというパスへのGETリクエストをハンドリングします。リクエストが来ると、HTML形式のレスポンスを生成して返します。

  • レスポンスヘッダーの設定
fastify.get("/header", async (request, reply) => {
  reply.header("Custom-Header", "Custom Value").send("Header set");
});

/headerというパスへのGETリクエストをハンドリングします。リクエストが来ると、レスポンスヘッダーを設定してレスポンスを返します。

  • ステータスコードの設定
fastify.get("/status", async (request, reply) => {
  reply.status(201).send("Created");
});

/statusというパスへのGETリクエストをハンドリングします。リクエストが来ると、ステータスコードを設定してレスポンスを返します。

  • リダイレクトの実行
fastify.get("/redirect", async (request, reply) => {
  reply.redirect("/new-location");
});

/redirectというパスへのGETリクエストをハンドリングします。リクエストが来ると、リダイレクトを行います。

  • エラーレスポンスの生成
fastify.get("/error", async (request, reply) => {
  const errorResponse = {
    error: "An error occurred",
  };
  reply.status(500).send(errorResponse);
});

/errorというパスへのGETリクエストをハンドリングします。リクエストが来ると、エラーレスポンスを生成して返します。

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

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

テスト

# JSONレスポンスのテスト
curl -X GET http://localhost:3000/json
# HTMLレスポンスのテスト
curl -X GET http://localhost:3000/html
# レスポンスヘッダーのテスト
curl -X GET http://localhost:3000/header -I
# ステータスコードのテスト
curl -X GET http://localhost:3000/status -I

まとめ

レスポンスオブジェクト(replyオブジェクト)を使用することで、以下のことが可能になります。

  • レスポンスヘッダーの設定や変更ができます。
  • レスポンスのHTTPステータスコードを設定できます。
  • レスポンスのボディデータを設定できます。JSONオブジェクト、文字列、バイナリデータなどの形式でデータを返すことができます。
  • レスポンスのエンコーディングや圧縮の設定を行うことができます。
  • リダイレクトやエラーハンドリングなど、特定の状況に応じたレスポンスの制御が可能です。

レスポンスオブジェクトを使用することで、Fastifyアプリケーション内でレスポンスの生成に関するさまざまな操作を行うことができます。レスポンスオブジェクトには多くのプロパティやメソッドがあり、高度なカスタマイズや制御が可能です。