fastify
#Framework #Node.js
概要
Node.js向けの高速なWebアプリケーションフレームワーク
サーバの起動
fastify#listenを呼ぶと、サーバを起動できます。
code:javascript
const fastify = require('fastify')();
const port = 3000;
fastify.listen(port, (err, address) => {
...
});
またfastify-cliを使って起動することも可能です
ルーティング
fastify#getやfastify#post等を使って定義します
code:javascript
fastify.get('/', async (req, reply) => {
// 親のプラグイン(api/index.js)でknexが登録されているため、ここで参照が可能
return await doSomething(req);
});
プラグインシステムについて
プラグインの実体は(fastify, options, next) => anyのようなシグネチャを持つ関数です
fastify#registerによってプラグインを登録できます
プラグインにはスコープが存在し、各プラグインごとに適用範囲を細かく制限できます
プラグインには親子関係が存在します
子のプラグインは、親のプラグインのスコープを継承するため、親側で登録されたプラグインも利用できます
子のプラグインで登録されたプラグインは、親のプラグインには適用されません (利用できません)
fastify-plugin
プラグインを記述するときに使用するnpmモジュールです
プラグインの登録
https://github.com/fastify/fastify/blob/master/docs/Getting-Started.md#loading-order-of-your-plugins の順に登録します。
バリデーション
fastifyはajvというJSON Schemaベースのバリデーションライブラリを採用しています
fastify#get等のメソッドでルートを定義する際にスキーマを渡すと、その定義をもとにバリデーションが行われます
fastify#{post|patch|get}(path, schema, handler);
schema引数にバリデーションルールを定義したオブジェクトを渡します(fluent-schemaを使うと楽そうです)
schema引数を指定すると、JSONのシリアライズ/デシリアライズが高速されるので、指定することを推奨します
ロギング
fastifyは標準でpinoを採用しています
code:javascript
const fastify = Fastify({ logger: false }); // ロギングを無効化(デフォルト)
const fastify = Fastify({ logger: { level: 'info' } });
fastify.log.info('info hoge'); // 出力される
fastify.log.error('error'); // 出力されない
const fastify = Fastify({ logger: { level: 'error' } });
fastify.log.info('info hoge'); // 出力されない
fastify.log.error('error error'); // 出力される
fastifyのファクトリ関数のloggerオプションで、ロギングに関する設定を変更できます
TypeScript対応について
fastifyのnpmモジュールは標準で型定義ファイルを提供しています
また、Nest.jsがfastify向けのアダプタを提供しているので、そちらを利用するのも手かと思います
プラグイン
fastify-plugin
fastify-autoload
- Process load measuring plugin for Fastify, with automatic handling of "Service Unavailable"
参考
awesome-fastify
https://github.com/fastify/fastify-example-twitter
why-we-built-another-framework
fastify-architecture-workshop