Fastifyのミドルウェアを作成し使用する方法
概要
Fastifyでは、ミドルウェア(middleware)を使用して、リクエストとレスポンスの間で処理を実行できます。 ミドルウェアは、リクエストオブジェクト、レスポンスオブジェクト、および次のミドルウェア関数へのアクセスを提供します。ミドルウェアは、Fastifyのルートハンドラ内で使用されます。
ここでは、以下バージョンを使用した、Fastifyでミドルウェアを作成する方法を紹介します。
Fastify v4.0.0
nodejs v19.7.0
また、今回作成するコードは全て、以下に掲載しています。 https://github.com/wiblok/Fastify
ミドルウェアの定義方法
ミドルウェアを使用するには、以下の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
メソッドを使用してミドルウェアを追加することができます。また、ミドルウェアを別のファイルとして分離することもできます。