【fastify】Getting Started 新規作成 〜 サーバ立ち上げ

tl;dr

fastify の Getting Started を実装してみた

バージョン

node v11.2.0
yarn v1.10.1
fastify v1.13.x

内容

インストール

まずはプロジェクトの新規作成と fastify のインストールを行います。

$ yarn init # プロジェクトの新規作成
yarn init v1.10.1
question name (learning-fastify): 
question version (1.0.0): 
question description: 
question entry point (index.js): 
question repository url (git@github.com:kazumatsudo/learning-fastify.git): 
question author (kazumatsudo): 
question license (MIT): 
question private: 
success Saved package.json
✨  Done in 48.63s.

$ yarn add fastify # fastify のインストール
yarn add v1.10.1
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
warning Your current version of Yarn is out of date. The latest version is "1.12.3", while you're on "1.10.1".
info To upgrade, run the following command:
$ curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
success Saved 58 new dependencies.
info Direct dependencies
└─ fastify@1.13.0
info All dependencies
├─ @types/events@1.2.0
├─ @types/node@10.12.10
├─ @types/pino@4.16.1
├─ abstract-logging@1.0.0
├─ ajv@6.5.5
├─ ansi-styles@3.2.1
├─ avvio@5.9.0
├─ chalk@2.4.1
├─ color-convert@1.9.3
├─ color-name@1.1.3
├─ core-util-is@1.0.2
├─ debug@3.2.6
├─ deepmerge@2.2.1
├─ end-of-stream@1.4.1
├─ escape-string-regexp@1.0.5
├─ fast-decode-uri-component@1.0.0
├─ fast-deep-equal@2.0.1
├─ fast-json-parse@1.0.3
├─ fast-json-stable-stringify@2.0.0
├─ fast-json-stringify@1.9.2
├─ fast-safe-stringify@1.2.3
├─ fastify@1.13.0
├─ fastq@1.6.0
├─ find-my-way@1.15.4
├─ flatstr@1.0.8
├─ forwarded@0.1.2
├─ has-flag@3.0.0
├─ inherits@2.0.3
├─ ipaddr.js@1.8.0
├─ isarray@1.0.0
├─ json-schema-traverse@0.4.1
├─ light-my-request@3.1.0
├─ middie@3.2.0
├─ ms@2.1.1
├─ once@1.4.0
├─ path-to-regexp@2.4.0
├─ pino-std-serializers@2.3.0
├─ pino@4.17.6
├─ process-nextick-args@2.0.0
├─ proxy-addr@2.0.4
├─ pump@3.0.0
├─ punycode@2.1.1
├─ quick-format-unescaped@1.1.2
├─ readable-stream@3.0.6
├─ ret@0.1.15
├─ reusify@1.0.4
├─ safe-buffer@5.1.2
├─ safe-regex@1.1.0
├─ semver-store@0.3.0
├─ split2@2.2.0
├─ string_decoder@1.1.1
├─ supports-color@5.5.0
├─ through2@2.0.5
├─ tiny-lru@1.6.4
├─ uri-js@4.2.2
├─ util-deprecate@1.0.2
├─ wrappy@1.0.2
└─ xtend@4.0.1
✨  Done in 5.05s.

コーディング

fastify がインストールできたので、次にエントリファイルにサーバのソースコードを書きます。

// index.js
// logger を true にすると、ログが出力されるようになる
const fastify = require('fastify')({
    logger: true
});

// ルーティングの設定
fastify.get('/', function (request, reply) {
    reply.send({ hello: 'world' })
});

// ポート3000番で受ける
fastify.listen(3000, function (err, address) {
    if (err) {
        fastify.log.error(err);
        process.exit(1);
    }
    fastify.log.info(`server listening on ${address}`)
});

実行

あとは node で実行すればサーバが立ち上がります。

$ node index.js 
{"level":30,"time":1542936968069,"msg":"Server listening at http://127.0.0.1:3000","pid":16660,"hostname":"kazumatsudo.local","v":1}
{"level":30,"time":1542936968070,"msg":"server listening on http://127.0.0.1:3000","pid":16660,"hostname":"kazumatsudo.local","v":1}

ブラウザから http://127.0.0.1:3000 にアクセスして json が表示されれば成功です。

async/await

async/await によるコーディングも可能です。

// logger を true にすると、ログが出力されるようになる
const fastify = require('fastify')({
    logger: true
});

// ルーティングの設定
// reply.send を用いずに return で返すことも可能
fastify.get('/', async () => {
    return { hello: 'world' }
});

// ポート3000番で受ける
const start = async () => {
    try {
        await fastify.listen(3000);
    } catch (err) {
        fastify.log.error(err);
        process.exit(1);
    }
};

// 実行
start();

async/await で記述すると、 ルーティングで reply.send で JSON を送っていた箇所が、 return で返せるようになります。
async/await を用いない際は return で返すことができないので注意が必要です。

補足

fastify はロガーのライブラリに pino を用いています。
pino には、ターミナルへのログ出力を整形してくれる pino-pretty というモジュールがあります。
pino-pretty はパイプライン処理を行うだけで簡単に利用できます。


$ yarn add -D pino-pretty # pino-pretty のインストール
yarn add v1.10.1
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
success Saved 8 new dependencies.
info Direct dependencies
└─ pino-pretty@2.2.4
info All dependencies
├─ args@5.0.0
├─ camelcase@5.0.0
├─ dateformat@3.0.3
├─ jmespath@0.15.0
├─ leven@2.1.0
├─ mri@1.1.1
├─ pino-pretty@2.2.4
└─ split2@3.0.0
✨  Done in 0.92s.

$ node index.js # ログをそのまま出力
{"level":30,"time":1542936968069,"msg":"Server listening at http://127.0.0.1:3000","pid":16660,"hostname":"kazumatsudo.local","v":1}
{"level":30,"time":1542936968070,"msg":"server listening on http://127.0.0.1:3000","pid":16660,"hostname":"kazumatsudo.local","v":1}

$ node index.js | pino-pretty # ログを pino-pretty で整形し出力
[1542938115625] INFO (16828 on kazumatsudo.local): Server listening at http://127.0.0.1:3000
[1542938115626] INFO (16828 on kazumatsudo.local): server listening on http://127.0.0.1:3000

ハイライトの関係で実際のターミナル上での表示と差異がありますが、ログをそのまま出力した際は色は変わらず、 pino-pretty を用いると色分けされて表示されます。

ソースコード

参考