Fastify(Node.jsフレームワーク)[入門編]

# 🐼はじめに
Node.jsを用いてWEBサーバを構築しようとした場合、`Express`などが候補に上がると思います。
今回紹介する`Fastify`は、非常に高速なフレームワークです。
今回はJSONを返すAPIサーバを構築します。

[ベンチマーク](https://github.com/fastify/benchmarks/blob/master/README.md)(一部抜粋)
| Framework | Version | Router | Requests/s | Latency | Throughput/Mb |
| :-------- | ------: | -----: | :--------: | ------: | ------------: |
| koa       |  2.13.4 |      ✗ |  22126.0   |   44.71 |          3.95 |
| hapi      |  20.2.2 |      ✓ |  18740.3   |   52.84 |          3.34 |
| express   |  4.18.1 |      ✓ |   7580.1   |  131.26 |          1.35 |
| fastify   |   4.6.0 |      ✓ |  29717.6   |   33.17 |          5.33 |


# 目次
+ Nodejsの初期化を行う
  + yarn
  + 初期化
  + fastify
+ コーディング
  + インポート/リッスン
  + ルーター
  + レスポンスタイプの設定(オプション)
+ まとめコード

# Nodejsの初期化を行う
## yarn
パッケージ管理をnpmではなくyarnで行います
```
$ npm install -g yarn
```

## 初期化
```
$ yarn init
```
ここで、`entry point (index.js):`という質問がされるので
```
entry point (index.js):index.mjs
```
と入力します
実行するためのファイルは`index.js`ではなく`index.mjs`となります。

## fastify
パッケージをインストールします
```
$ yarn add fastify
```

# コーディング
## インポート/リッスン
```js
import Fastify from 'fastify';
const fastify = Fastify({
    // loggerをtrueにするとログが出力される
    logger: false
})

fastify.listen({ port: 3000 }, (err, address) => {
    if (err) {
        throw err
    }
})
```

## ルーター
### 待ち受けの書き方
```js
// GETの時
fastify.get("パス", function名)
// POSTの時
fastify.post("パス", function名)
```

### パスの書き方
#### パスを固定で指定する時
```js
// GET `http://localhost:3000/` の場合
fastify.get("/", index)
function index(req, res) {
    res.code(200);
    return { "mes": "This is index" }
}
// POST `http://localhost:3000/` の場合
// ヘッダーに Content-Type:application/json をセットしてクエリを投げる
fastify.post("/", indexPost)
function indexPost(req, res) {
    res.code(200);
    const body = req.body // リクエストのJSON
    console.log(body)
    return { "mes": "This is POST index" }
}
// GET `http://localhost:3000/hello` の場合
fastify.get("/hello", hello)
function hello(req, res) {
    res.code(200);
    return { "mes": "This is hello" }
}
```

#### パスを変数にする時(taroを変数として取得する)
```js
// GET `http://localhost:3000/taro` などの場合 `/:name`
fastify.get("/:name", name)
function name(req, res) {
    res.code(200);
    const name = req.params.name;
    return { "mes": `Hello ${name}` }
}
// GET `http://localhost:3000/ohayou/taro` の場合 `/ohayou/:name`
fastify.get("/ohayou/:name", ohayou)
function ohayou(req, res) {
    res.code(200);
    const name = req.params.name;
    return { "mes": `ohayou ${name}` }
}
```

# レスポンスタイプの設定(オプション)
```js
    res.code(200);
```
の部分は省略可能だが
```js
    // text/html で返す場合 
    res.type("text/html").code(200);
```
のような記述も可能

# まとめコード
```js
import Fastify from 'fastify';
const fastify = Fastify({
    logger: false
})

fastify.listen({ port: 3000 }, (err, address) => {
    if (err) {
        throw err
    }
})

fastify.get("/", index)
function index(req, res) {
    res.code(200);
    return { "mes": "This is index" }
}
fastify.post("/", indexPost)
function indexPost(req, res) {
    res.code(200);
    const body = req.body
    console.log(body.aaa)
    return { "mes": "This is POST index" }
}
fastify.get("/hello", hello)
function hello(req, res) {
    res.code(200);
    return { "mes": "This is hello" }
}

fastify.get("/:name", name)
function name(req, res) {
    res.code(200);
    const name = req.params.name;
    return { "mes": `Hello ${name}` }
}
fastify.get("/ohayou/:name", ohayou)
function ohayou(req, res) {
    res.code(200);
    const name = req.params.name;
    return { "mes": `ohayou ${name}` }
}
```

# 🐼最後に
Nodejsでも速さを活かしたい場面というのはあるでしょう。
そういう時に使うと良いと思います。