ミドルウェア
ミドルウェア
Fastify v3.0.0以降、ミドルウェアは標準ではサポートされておらず、@fastify/expressや@fastify/middieなどの外部プラグインが必要です。
Expressミドルウェアをuseするために@fastify/expressプラグインを登録する例
await fastify.register(require('@fastify/express'))
fastify.use(require('cors')())
fastify.use(require('dns-prefetch-control')())
fastify.use(require('frameguard')())
fastify.use(require('hsts')())
fastify.use(require('ienoopen')())
fastify.use(require('x-xss-protection')())
シンプルなExpressスタイルのミドルウェアを、パフォーマンスを向上させてサポートする@fastify/middieを使用することもできます。
await fastify.register(require('@fastify/middie'))
fastify.use(require('cors')())
ミドルウェアはカプセル化できることを覚えておいてください。つまり、プラグインガイドで説明されているように、registerを使用してミドルウェアの実行場所を決定できます。
Fastifyのミドルウェアは、sendメソッドやFastifyのレスポンスインスタンス固有の他のメソッドを公開しません。これは、Fastifyが内部的に着信reqとresのNodeインスタンスをリクエストとレスポンスオブジェクトでラップしますが、これはミドルウェアフェーズの後に行われるためです。ミドルウェアを作成する必要がある場合は、Nodeのreqとresインスタンスを使用する必要があります。それ以外の場合は、リクエストとレスポンスのFastifyインスタンスを既に持っているpreHandlerフックを使用できます。詳細については、フックを参照してください。
特定のパスへのミドルウェア実行の制限
特定のパスでのみミドルウェアを実行する必要がある場合は、パスをuseの最初の引数として渡すだけで済みます!
これはパラメータ付きのルート(例:/user/:id/comments)をサポートしておらず、複数のパスでワイルドカードはサポートされていません。
const path = require('node:path')
const serveStatic = require('serve-static')
// Single path
fastify.use('/css', serveStatic(path.join(__dirname, '/assets')))
// Wildcard path
fastify.use('/css/(.*)', serveStatic(path.join(__dirname, '/assets')))
// Multiple paths
fastify.use(['/css', '/js'], serveStatic(path.join(__dirname, '/assets')))
代替手段
Fastifyは、最も一般的に使用されるミドルウェアのいくつかの代替手段を提供しています。たとえば、helmetの場合は@fastify/helmet、corsの場合は@fastify/cors、serve-staticの場合は@fastify/staticなどです。