ウェブエンジニア問題集
第1章

Fastifyとは何か — Expressの次に学ぶNode.js APIフレームワーク

6
この章の目次開く

Node.jsでAPIサーバーを作るとき、最初に触れるフレームワークとしてはExpressが有名です。Expressは仕組みが素直で、Node.js入門のExpress章で学んだように、ルーティングとミドルウェアを理解するには今でもよい教材です。

一方で、実務のAPIでは「入力値を毎回検証したい」「レスポンスの形を揃えたい」「機能単位でルートや認証を分けたい」「テストしやすい構造にしたい」という要求がすぐに出てきます。Fastifyは、このあたりをフレームワークの中心に置いたNode.js向けのWebフレームワークです。

Fastifyは「速いExpress」ではなく、schema、plugin、encapsulationを使ってAPIを設計するフレームワークです。
学習者学習者

Expressが分かっていれば、Fastifyも同じように書けますか?

先生先生

ルーティングの考え方は近いです。ただしFastifyでは「ルートにschemaを付ける」「機能をpluginとして登録する」という設計がかなり重要になります。

Fastifyが得意なこと

Fastifyは、JSON APIを作る場面で特に扱いやすいです。最初からログ、入力検証、レスポンスのシリアライズ、プラグインによる分割、テスト用のHTTP injectionがそろっています。

得意なこと何がうれしいか
ルートごとの schemaリクエストの検証とレスポンス形式をルート定義の近くに置ける
register() によるプラグイン分割/api/users/admin のような単位で機能を閉じ込められる
encapsulationプラグイン内の設定、hooks、decoratorの影響範囲を制御できる
fastify.inject()サーバーを実際にlistenしなくてもAPIテストを書ける
組み込みロガーrequest.logfastify.log で構造化ログを出しやすい
APIの構成要素を整理する人
FastifyはAPIの入口、検証、処理、レスポンスを1つのルート定義に集約しやすい

Expressとの違い

Expressは「ミドルウェアを順番に並べる」感覚が中心です。Fastifyにもhooksはありますが、中心になるのはルート定義、schema、pluginです。

観点ExpressFastify
ルート定義app.get(path, handler)fastify.get(path, options, handler)
入力検証自分でミドルウェアやライブラリを組み込むルートの schema にJSON Schemaを書く
機能分割Routerやミドルウェアで分割pluginを register() する
スコープ基本は上から順に全体へ効くpluginごとに影響範囲を閉じ込められる
テストsupertestなどを使うことが多いfastify.inject() が組み込みで使える

どちらが常に優れている、という話ではありません。既存のExpress資産が多いチームならExpressを続ける判断も自然です。新しくJSON APIを作るなら、Fastifyのschema中心の設計はかなり強い選択肢になります。

この本で作るもの

この本では、最初に小さなFastifyサーバーを作り、少しずつTodo APIへ育てていきます。最終的には、次のような要素を持つAPIを作れる状態を目指します。

  • GET /todos で一覧を返す
  • POST /todos で入力値を検証して作成する
  • GET /todos/:id で1件取得する
  • 404やバリデーションエラーを整理して返す
  • ルートをプラグインへ分割する
  • node:testfastify.inject() でAPIテストを書く

先に知っておきたい前提

この本では、Node.jsとnpmの基本を知っている前提で進めます。不安がある場合は、先にNode.js入門のセットアップ、npm、HTTPサーバー、エラーハンドリングの章を読むとつながりやすいです。

コード例はES Modulesで書きます。つまり import Fastify from 'fastify' の形です。CommonJSの既存コードを読む必要がある場合は、CommonJSとES Modulesの章も参照してください。

参考リンク

次章では、実際にFastifyをインストールして、最小のサーバーを起動します。

Node.jsクイズに挑戦するFastifyの土台になるNode.jsの知識を、4択クイズでアウトプットして定着させよう