Fastifyのミドルウェアを作成し使用する方法

概要

Fastifyでは、ミドルウェア(middleware)を使用して、リクエストとレスポンスの間で処理を実行できます。 ミドルウェアは、リクエストオブジェクト、レスポンスオブジェクト、および次のミドルウェア関数へのアクセスを提供します。ミドルウェアは、Fastifyのルートハンドラ内で使用されます。

ここでは、以下バージョンを使用した、Fastifyでミドルウェアを作成する方法を紹介します。

Fastify v4.0.0
nodejs v19.7.0

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

ミドルウェアの定義方法

ミドルウェアを使用するには、以下の3つの方法があります。

  1. ミドルウェア関数を直接使用する方法
  2. ミドルウェアをカプセル化したプラグインを作成する方法
  3. ミドルウェアを分離したファイルとして作成する方法

ミドルウェア関数を直接使用する方法

direct.js

const fastify = require('fastify')();

function myMiddleware(request, reply, next) {
  // ミドルウェアの処理
  console.log('ミドルウェアの実行');
  next();
}

fastify.addHook('preHandler', myMiddleware);

fastify.get('/', (request, reply) => {
  reply.send({ message: 'Hello, World!' });
});

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モジュールをインポートし、そのインスタンスを作成します。

  • ミドルウェアの定義
function myMiddleware(request, reply, next) {
  // ミドルウェアの処理
  console.log('ミドルウェアの実行');
  next();
}

ミドルウェア関数myMiddlewareを定義します。この関数は、ルートハンドラーが実行される前に呼び出され、コンソールにメッセージを出力します。

  • ミドルウェアの登録
fastify.addHook('preHandler', myMiddleware);

Fastifyインスタンスにミドルウェアを登録します。preHandlerフックとして追加されるため、ルートハンドラーが実行される前にmyMiddleware関数が呼び出されます。

  • ルートハンドラの定義
fastify.get('/', (request, reply) => {
  reply.send({ message: 'Hello, World!' });
});

/というパスへのGETリクエストをハンドリングするルートハンドラーを定義します。リクエストが来ると、{ message: 'Hello, World!' }というオブジェクトをレスポンスとして返します。

  • サーバーの起動
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 GET http://localhost:3000

ミドルウェアをカプセル化したプラグインを作成する方法

capsule.js

const fastify = require('fastify')();

const myPlugin = (fastify, options, done) => {
  function myMiddleware(request, reply, next) {
    // ミドルウェアの処理
    console.log('ミドルウェアの実行');
    next();
  }

  fastify.addHook('preHandler', myMiddleware);

  done();
};

fastify.register(myPlugin);

fastify.get('/', (request, reply) => {
  reply.send({ message: 'Hello, World!' });
});

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モジュールをインポートし、そのインスタンスを作成します。

  • プラグインの定義
const myPlugin = (fastify, options, done) => {
  function myMiddleware(request, reply, next) {
    // ミドルウェアの処理
    console.log('ミドルウェアの実行');
    next();
  }

  fastify.addHook('preHandler', myMiddleware);

  done();
};

プラグインmyPluginを定義します。このプラグインはミドルウェア関数myMiddlewareを定義し、FastifyインスタンスにpreHandlerフックとして追加します。myMiddleware関数は、ルートハンドラーが実行される前に呼び出され、コンソールにメッセージを出力します。

  • プラグインの登録
fastify.register(myPlugin);

Fastifyインスタンスにプラグインを登録します。

  • ルートハンドラの定義
fastify.get('/', (request, reply) => {
  reply.send({ message: 'Hello, World!' });
});

/というパスへのGETリクエストをハンドリングするルートハンドラーを定義します。リクエストが来ると、{ message: 'Hello, World!' }というオブジェクトをレスポンスとして返します。

  • サーバーの起動
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 GET http://localhost:3000

このコードでは、Fastifyを使用してプラグインを定義し、そのプラグイン内でミドルウェアを登録します。ミドルウェアはリクエストがハンドラーに到達する前に実行されます。ハンドラーはレスポンスとして"Hello, World!“というメッセージを送信します。

ミドルウェアを分離したファイルとして作成する方法

middlewares.js


function myMiddleware(request, reply, next) {
  // ミドルウェアの処理
  console.log('ミドルウェアの実行');
  next();
}

module.exports = {
  myMiddleware
};

middlewares-main.js

const fastify = require('fastify')();
const middlewares = require('./middlewares');

fastify.addHook('preHandler', middlewares.myMiddleware);

fastify.get('/', (request, reply) => {
  reply.send({ message: 'Hello, World!' });
});

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モジュールをインポートし、そのインスタンスを作成します。

  • ミドルウェアのインポート
const middlewares = require('./middlewares');

middlewaresモジュールをインポートします。このモジュールはmyMiddlewareという名前のミドルウェア関数をエクスポートしていると想定されます。

  • ミドルウェアの追加
fastify.addHook('preHandler', middlewares.myMiddleware);

FastifyインスタンスにpreHandlerフックとしてミドルウェアを追加します。myMiddleware関数は、ルートハンドラーが実行される前に呼び出されます。

  • ルートハンドラの定義
fastify.get('/', (request, reply) => {
  reply.send({ message: 'Hello, World!' });
});

/というパスへのGETリクエストをハンドリングするルートハンドラーを定義します。リクエストが来ると、{ message: 'Hello, World!' }というオブジェクトをレスポンスとして返します。

  • サーバーの起動
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 GET http://localhost:3000

このコードでは、Fastifyを使用してサーバーを作成し、preHandlerフックを使用してミドルウェアを定義しています。ミドルウェアは、リクエストがハンドラーに到達する前に実行され、ミドルウェアの処理が実行されることを示しています。ハンドラーは、指定されたパスに対してリクエストが送信された場合に実行され、適切なレスポンスが返されます。

まとめ

この記事では、Fastifyでミドルウェアを使用する方法について説明しました。ミドルウェアは、リクエストの前後に実行される関数であり、リクエストの処理をカスタマイズするために使用されます。Fastifyでは、addHook メソッドを使用してミドルウェアを追加することができます。また、ミドルウェアを別のファイルとして分離することもできます。