Fastifyでセッション情報を処理する方法

概要

Fastifyでは、セッション情報の処理はミドルウェア関数内で行います。
ミドルウェア関数の引数には、requestオブジェクトとreplyオブジェクトが渡されます。 これらのオブジェクトを使用して、セッションに関連するデータの取得やレスポンスの生成などを行います。

ここでは、以下バージョンを使用した、Fastifyでセッション処理する方法を説明します。

Fastify v4.0.0
Node v20.0.0
@fastify/session v10.4.0
@fastify/cookie v8.3.0

また、今回作成するコードは全て、GitHubに掲載しています。

なお、本記事では、@fastify/sessionモジュールを使用するため以下コマンドを入力して、@fastify/sessionをインストールしてください、

npm install fastify @fastify/session @fastify/cookie @fastify/formbody @fastify/view ejs

セッション情報を取得する方法

セッションに関する情報を取得するには、@fastify/sessionミドルウェアとリクエストオブジェクトを使用します。 @fastify/sessionは、クライアントからのリクエストに含まれるセッション情報を解析します。解析されたセッションはリクエストオブジェクトのsessionプロパティに格納されます。

以下のサンプルコードは、Fastifyでセッションを理解するための例です。GETリクエストを受け取り、リクエストに含まれるセッションにアクセスして、それらの値を含むレスポンスを返します。

session.js

const fastify = require("fastify")({ logger: true });
const session = require("@fastify/session");
const cookie = require("@fastify/cookie");
const formbody = require("@fastify/formbody");
const view = require("@fastify/view");
const ejs = require("ejs");

fastify.register(cookie);
fastify.register(session, {
  secret: "a secret with minimum length of 32 characters",
  cookie: {
    secure: false,
  },
  saveUninitialized: false,
});
fastify.register(formbody);

fastify.register(view, {
  engine: {
    ejs: ejs,
  },
});
fastify.get("/", (req, reply) => {
  reply.view("/views/index.ejs");
});

fastify.get("/dashboard", (req, reply) => {
  if (req.session.user) {
    reply.view("/views/dashboard.ejs", { username: req.session.user });
  } else {
    reply.redirect("/");
  }
});

fastify.post("/login", (req, reply) => {
  const { username, password } = req.body;

  // ここでユーザー名とパスワードの検証を行う(省略)
  req.session.user = username;

  reply.redirect("/dashboard");
});

fastify.listen({ port: 3000 }, (err, address) => {
  if (err) throw err;
  fastify.log.info(`server listening on ${address}`);
});


解説

このコードはFastifyフレームワークを使用したWebアプリケーションのサーバーサイドの実装を示しています。以下に主要な部分を箇条書きで解説します。

  • 必要なモジュールのインポート
const fastify = require("fastify")({ logger: true });
const session = require("@fastify/session");
const cookie = require("@fastify/cookie");
const formbody = require("@fastify/formbody");
const view = require("@fastify/view");
const ejs = require("ejs");

ここではFastifyフレームワークと、いくつかのFastifyプラグイン(cookie管理、セッション管理、フォームデータの解析、ビューのレンダリング)、およびテンプレートエンジンのEJSをインポートしています。

  • Fastifyプラグインの登録
fastify.register(cookie);
fastify.register(session, {
  secret: "a secret with minimum length of 32 characters",
  cookie: {
    secure: false,
  },
  saveUninitialized: false,
});
fastify.register(formbody);
fastify.register(view, {
  engine: {
    ejs: ejs,
  },
});

Fastifyインスタンスに各プラグインを登録しています。これにより、セッション、クッキー、フォームデータの解析、EJSビューなどの機能が利用可能になります。

  • ルートハンドラの定義
fastify.get("/", (req, reply) => {
  reply.view("/views/index.ejs");
});

fastify.get("/dashboard", (req, reply) => {
  if (req.session.user) {
    reply.view("/views/dashboard.ejs", { username: req.session.user });
  } else {
    reply.redirect("/");
  }
});

fastify.post("/login", (req, reply) => {
  const { username, password } = req.body;
  // ここでユーザー名とパスワードの検証を行う(省略)
  req.session.user = username;
  reply.redirect("/dashboard");
});

fastify.getfastify.post はHTTP GETとPOSTリクエストをそれぞれ処理するルートを定義します。それぞれのルートは特定のパスにリクエストが来たときに呼び出される関数(ハンドラ)を持っています。

  • サーバーの起動
fastify.listen({ port: 3000 }, (err, address) => {
  if (err) throw err;
  fastify.log.info(`server listening on ${address}`);
});

fastify.listen を使用して、特定のポート(この場合は3000)でサーバーを起動します。サーバーが起動したら、アドレス情報をログに出力します。

まとめ

この記事では、Fastifyを使用してセッション情報を処理する方法を紹介しました。具体的には、@fastify/sessionミドルウェアを使用してリクエストに含まれるセッション情報を取得し、それをレスポンスとして返す方法を示しました。セッション情報はWebアプリケーションで非常に重要な役割を果たしますので、その取扱いを理解することは重要です。この記事がその理解に役立つことを願っています。