Fastifyで静的ファイルをレスポンスする方法

静的ファイルを効率的に扱い、セキュリティを強化するためのFastifyの活用方法を学びましょう。このガイドでは、fastify-staticプラグインの設定から仮想パスプレフィックスの使用まで、Fastifyで静的ファイルをハンドリングするためのステップを詳しく解説します。

はじめに

Fastifyを使用すると、デフォルトでは静的ファイルをレスポンスとして返すことができません。これは、画像や動画などの静的ファイルを扱うためには、fastify-staticプラグインを設定し、静的ファイルへのアクセスを許可する必要があります。 今回、静的ファイルのルーティング、そして仮想パスプレフィックスの使用について詳しく解説します。

ここでは、以下バージョンを使用した、ルーティング方法を説明します。

Fastify v3.25.1
Node v20.7.0

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

静的ファイルのルーティング

静的ファイルを提供する最小限のコードは以下の通りです。

static.js

const fastify = require('fastify')({ logger: true })
const path = require('path')
const fastifyStatic = require('fastify-static')

fastify.register(fastifyStatic, {
  root: path.join(__dirname, 'public'),
  prefix: '/public/',
})

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

解説

  • Fastifyモジュールとpathモジュールのインポート
const fastify = require('fastify')({ logger: true })
const path = require('path')

上記コードでは、fastifypathという名前のモジュールを読み込みます。

  • fastify-staticプラグインの登録
const fastifyStatic = require('fastify-static')

fastify.register(fastifyStatic, {
  root: path.join(__dirname, 'public'),
  prefix: '/public/',
})

上記コードでは、fastify-staticプラグインを使用して、“public"という名前のディレクトリ内の静的ファイルをホスティングしています。これにより、このディレクトリ内のファイルは、そのファイル名をパスとするURLで直接アクセスすることができます。

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

このコードは、3000番ポートでサーバーを起動します。サーバーが正常に起動すると、‘Server listening on ${address}‘というメッセージがコンソールに表示されます。

/public/static.txt

hello world

そして、以下のようにディレクトリ構造を設定します。

/root
|-- static.js
|-- public
    |-- static.txt

以上の設定により、publicフォルダに配置された静的ファイルにアクセスすることができます。

curl http://localhost:3000/public/static.txt

仮想パスプレフィックスの利用

プロジェクトのディレクトリ構造をそのまま公開すると、セキュリティ上の問題が生じる可能性があります。その問題を解決するために、仮想パスプレフィックスを使用することが推奨されます。

仮想パスプレフィックスとは、実際のファイルシステムパスには存在しないパスを設定し、それを特定のディレクトリにマッピングする機能です。

virtual.js

const fastify = require('fastify')({ logger: true })
const path = require('path')
const fastifyStatic = require('fastify-static')

fastify.register(fastifyStatic, {
  root: path.join(__dirname, 'public'),
  prefix: '/public/',
})

fastify.register(fastifyStatic, {
  root: path.join(__dirname, 'virtual'),
  prefix: '/virtual/',
})

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

解説

モジュールとpathモジュールのインポート

const fastify = require('fastify')({ logger: true })
const path = require('path')

上記コードでは、fastifypathという名前のモジュールを読み込みます。

  • fastify-staticプラグインの登録
const fastifyStatic = require('fastify-static')

fastify.register(fastifyStatic, {
  root: path.join(__dirname, 'public'),
  prefix: '/public/',
})

fastify.register(fastifyStatic, {
  root: path.join(__dirname, 'virtual'),
  prefix: '/virtual/',
})

このコードでは、まずfastify-staticプラグインを読み込み、Fastifyサーバーに登録します。そして、publicvirtualという二つのディレクトリ内の静的ファイルをホスティングします。これにより、これらのディレクトリ内のファイルは、それぞれのディレクトリ名とファイル名をパスとするURLで直接アクセスすることができます。

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

このコードは、3000番ポートでサーバーを起動します。サーバーが正常に起動すると、‘Server listening on ${address}‘というメッセージがコンソールに表示されます。

そして、以下のようにディレクトリ構造を設定します。

/root
|-- virtual.js
|-- public
    |-- static.txt
|-- virtual
    |-- virtual.txt

以上の設定により、publicフォルダやvirtualフォルダに配置された静的ファイルにアクセスすることができます。

curl http://localhost:3000/public/static.txt
curl http://localhost:3000/virtual/virtual.txt

以上で、Fastifyを用いた静的ファイルの効率的なハンドリング方法と仮想パスプレフィックスの使用について説明しました。これらの方法を利用すれば、よりセキュアで効率的な静的ファイルのハンドリングが可能になります。

まとめ

静的コンテンツをホスティングするために、Fastifyはfastify-staticプラグインを提供しています。このプラグインを使用すると、静的ファイルをホスティングするためのコードを簡単に記述することができます。また、仮想パスプレフィックスを使用することで、セキュリティ上の問題を解決することができます。