TL;DR
Packtで販売されているBeginning API Development with Node.jsをやってみましたのでその記録です。
Node.jsの仕組みからHapiを主に使用したREST API開発が学べます。
Javascriptの構文的な説明は内包されていません。
はじめに
各リンク
使うもの
下記の物が登場します。
MySQLWorkbench/Insomniaは使わなくてもOKです。(動画上は使われますが、適時置き換えで大丈夫だと思います)
ツール
- MySQLWorkbench MySQLの色々GUIツール
- Insomnia REST CLIENT
Node.js
注意点
Hapiは動画上v16を使用しますが、バージョンを指定しないと最新版のv17がインストールされます。
結構動画と同じコードでは動かなくなるので動画のとおりに進めたい場合は指定されるバージョンで進めてください。
自身が行ったものは勉強を含めてv17で進めていますが、完全な代替コードになっているかは自信がないです。
途中登場する hapi-auth-jwt
も v17はサポートされていない&メンテされていなさそうでしたので、
Hapi v17で進める場合は hapi-auth-jwt2 を使用すると良いかと思います。
Chapter 1 Introduction to Node.js
Node.jsの基本的な仕組み(イベントループ等)やモジュールシステム、同期処理の書き方、組み込みライブラリ、npmコマンド等の説明があります。
Chapter 2: Building the API: Part 1
要約
httpモジュールでサーバー作成を体験、Hapiに置き換えて /todo
/todo/:id
のRESTのルートをDB無しで実装する、という内容です。
詳細
httpモジュールを使用した最低限のサーバーを作ってから、実際にHapiを使って開発していきます。
メソッドの各説明(これはRESTに沿った説明です)後に /todo
/todo/:id
系のルーティングの各メソッドのrouteを設定します。
この時点ではDBではなく内部的に実装・用意したデータを使用して擬似的に作成します。
その後Insomniaを使用してAPIのテストを行い動作を確認します。
Hapi v17
Hapi v17を使用している場合基本コードから違うので適時 公式のGetting Startedを参照してください。
覚えている範囲ではありますが、基本的なレスポンス部分が違います
v16
handler: (response, reply) => reply({ message: 'Hello'})
handler: (response, reply) => reply({ message: 'Not Found'}).code(404)
v17
handler: (response, h) => { message: 'Hello'}
handler: (response, h) => h.response({ message: 'Not Found'}).code(404)
あとGood(Logger)を使用する際にもプラグインの登録方法 ( server.register
)が変わっているようなので調べる必要があります。
Chapter 3: Building the API: Part 2
要約
Chapter2で作ったAPIを実際にKnexを使用してDBに接続していきます。
その後APIにJWT(Json Web Token)を使用した認証機能を追加し、Labを使ったAPIテストを記載します。
詳細
MySQLWorkbenchを使用しててDB作成、テーブル、レコードの作成を行います。
そこに対してKnexでAPIを実施にDBに使用する形に変えていきます。
APIがDBを使うようになった所でJWTを使用した認証機能を実装します。
最後にLabを使用したAPIテストを実装します。
(若干Gulpによるテストの自動実行もありますが、個人的にスキップしました)
Hapi v17
こちらもJWT認証を実装する時にプラグインの実装でバージョン差問題が発生します。
また、Labを使用したテスト実装の際にもこのプラグインの実装の変更影響でserverのインスタンスが動画のまま実装しているとキレイにrequireできません。
ここについてはその時点でかなり書き直してしまったのでGithubの方を参照してください。
Docker MySQL
(明確には判明していない話)
MySQLWorkbench が MySQL8系に対応していないかもしれません。
動画ではローカルのMySQLを使いますが、Dockerをなんとなく使用していました。
動画と同じようにMySQLWorkbenchで進めるけどDockerを使う、という場合は5系を入れる必要があるかもしれません。
docker pull mysql:5.7
docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql:5.7
感想
よかったこと
- Node.jsでバックエンドを実装する場合の全体の雰囲気が掴めた
- 動画の長さが短い(公式の記載によれば1時間40分)
- Hapi x MySQL(Knex) の教材は中々ない
気になった所
- 2018/05/28に発売された割にバージョンが古い
- FW選択(Lab → Jest? / Gulp etc)や中途半端な新構文の使用等、新しさという所でちょっと気になる所
- KnexのMigrationやSeedを使用しない
余談
以下は全部本当に詳しくないものの詳しくないので途中で関連して調べたり考えた情報です
Node.js ORM
Knexというものも知らなかったので、色々DB、ORM系を調べてみた所
- Sequelize
- Bookshelf (with Knex)
- Objection (with Knex)
が主要のようです。
DBは再度全く詳しくないのですが…。
Sequelizeは生成されるSQLが場合によって非効率なものが生成されるようでstar数等は随一だけど敬遠されがちで、
Bookshelfは物は良いのだけど裏側にBackbone.jsがいて構文が結構強制されていて気持ち悪いらしく、
結果最近だとObjectionがイケてるらしい。です。
REST CLIENT
Insomniaを今回知りましたが、Postmanと比べた感じPostmanで良い気がしました。
両方詳細には触っていないのですがPostmanの方ができること多そうな…気がしました。あとはPawというものもあるようですね。
今後の改修
Migration/SeedをKnexで実装しつつ、Objectionを使用してModelでのやり取りを実装、テストはJestに置き換え、認証をPassportで追加、あたりはやってみたいので別途やってみようかと思います。
一部書きました
Knex.jsを使用したMigrationとSeedの作成
おわりに
FEだけどバックエンド興味あるという人には結構良い教材だと思います。
大体Node.jsのバックエンド系教材はNoSQL(特にMongoDB)の教材が多くて、そうなるとmongooseがORMになって…という風になっているのでRDBを扱っているのも良いポイントかもしれません。(今更ですが、Hapi x RDB教材を探して辿り着きました)
MEANスタックでいいよ、というような方にはFW構成が大分違うので恐らく向かないと思います。