fastify
概要
fastifyの特徴
速い🚅
プラグインシステムを採用しており、拡張性が高い
fastifyではmiddlewareやrouterなどもすべてプラグインとして扱います
サーバの起動
fastify#listenを呼ぶと、サーバを起動できます。
code:javascript
const fastify = require('fastify')();
const port = 3000;
fastify.listen(port, (err, address) => {
...
});
ルーティング
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によってプラグインを登録できます
プラグインにはスコープが存在し、各プラグインごとに適用範囲を細かく制限できます
プラグインには親子関係が存在します
子のプラグインは、親のプラグインのスコープを継承するため、親側で登録されたプラグインも利用できます
子のプラグインで登録されたプラグインは、親のプラグインには適用されません (利用できません)
例)
api/users.js
code:javascript
function usersAPI(fastify, options, next) {
fastify.get('/', async (req, reply) => {
// 親のプラグイン(api/index.js)でknexが登録されているため、ここで参照が可能
return await fastify.knex.select('*').from('users');
});
next();
}
module.exports = usersAPI;
api/index.js
code:javascript
const usersAPI = require('./users');
const knex = require('./knex');
function api(fastify, options, next) {
fastify.decorate('knex', knex);
fastify.register(usersAPI, { prefix: '/users' });
next();
}
module.exports = api;
server.js
code:javascript
const Fastify = require('fastify');
const api = require('./api');
fastify.register(api);
fastify.get('/', (req, reply) => {
fastify.knex; // => undefined. ここではknexを参照できない。
});
module.exports = fastify;
fastify-plugin
プラグインを記述するときに使用するnpmモジュールです
プラグインの登録
バリデーション
fastify#get等のメソッドでルートを定義する際にスキーマを渡すと、その定義をもとにバリデーションが行われます
fastify#{post|patch|get}(path, schema, handler);
schema引数を指定すると、JSONのシリアライズ/デシリアライズが高速されるので、指定することを推奨します
ロギング
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オプションで、ロギングに関する設定を変更できます
loggerオプションには、下記いずれかの値を設定します
false
ロガーを無効化(デフォルト値)
object
Pinoのオプションを指定する. 以下のプロパティを省略した際は自動で設定されます
genReqId - 連番を生成する関数が設定されます
level - デフォルト値はinfo
テストについて
fastify#injectという、テストでの利用を想定したメソッドが存在します
このメソッドを利用することで、supertest等のライブラリを利用しなくとも、エンドポイントのテストが記述できます TypeScript対応について
fastifyのnpmモジュールは標準で型定義ファイルを提供しています プラグイン
API
Reply
#type(contentType)
レスポンスのContent-Typeを設定
#getResponseTime
リクエスト開始からの経過時間を返却する。
参考