This was created during my time as a Code Chrysalis Student
このプロジェクトは以前見てきたものよりも複雑で、CC を卒業して最初の職を得て、あるタスクを任された場合を想定しています。圧倒されてしまうのが 普通 です。
あなたをサポートするために、いくつかの指針を以下に示します:
- 大規模なプロジェクトでは、別のチームに所属したり、開発者が別のタスクやプロジェクトの一部を作業することになるため、すべてを理解するための十分な時間がありません。
- 特定のタスクを持ち、あなたが作業する必要のある箇所がコードベースの どこにあるか 見つけることを優先する必要が出てくるでしょう。
- VSCode はあなたの友達です。必要な箇所を見つけるために、
CMD + P
を使用してファイル間をすばやく移動し、”マイグレーション”などの用語を検索しましょう。 - あなたはすべてを把握していなくても気にならないようになる必要があります、覚えておいてください:Conjure, CONJURE, CONJURE
このスプリントの後半では、よくあるチャットアプリで、アプリのビジネスロジックとデータベースを統合する方法について説明します。デファクトスタンダードである knex を使用して Node で SQL を記述して、マイグレーションと、常に データベースを意識せずにビジネスロジックを記述できるようにシンプルな ORM を書く方法について見ていきます。シンプルなチャットアプリである Clack - The Crappy Slack
のバックエンドを構築します。ユーザは以下の操作を行うことができます:
- お互いにメッセージを送受信する。
- チャンネルを作成する。
- チャンネルに参加する。
- 参加したチャンネルからメッセージを送受信する。
このスプリントでは、ルーティングとフロントエンドに関しては、あなたのためにほとんど用意しておきました。今回の課題では、ほとんどの時間を ./services/db/*
に注力しましょう。
このスプリントの前半では、生の SQL を記述してデータベースとやり取りをしました。ご想像のとおり、これは時として苦痛であるため、SQL をより javascript ライクな方法で記述できるライブラリを使用して Node でデータベースとやり取りすることをお勧めします。Knex はこのためのデファクトスタンダードなライブラリであり、このスプリントでは Knex を頻繁に利用します。Knex のドキュメントを頻繁に読むことになるため、ドキュメントを 1 つのタブに開いたままにしておくことをお勧めします。簡単に言うと、knex はクエリビルダーです。つまり、Knex は、通常の Javascript でクエリを記述し、それを SQL に変換することができます。恐れてはいけません。それを受け入れましょう。
マイグレーションについては、前半のスプリントの追加課題で説明しましたが、前回それに取り組んでいなくても問題ありません。-- ここでもう一度説明します。
テーブルのスキーマを変更するたびに、マイグレーション内でスキーマの変更を行います。マイグレーションとは、何らかの方法でスキーマを変更し、新しいスキーマに適合するようにデータを修正する一連のクエリです。マイグレーションは 常に トランザクション内で行われるべきです。トランザクションについてよくわからない場合は、前のスプリントの追加課題の説明を読むことで、このスプリントで必要となるトランザクションについて理解することができます。
困った時は、必要であればトランザクションに関するこの短いチュートリアルを試してみましょう。
ORM はオブジェクト関係マッピング(Object Relational Mapping)の略であり、データベースの出力結果をオブジェクトに変換します。データベースの出力結果とオブジェクトの違いは、オブジェクトはメソッドを持つことができ、そのメソッドはあらゆる種類の処理を実行するのに利用されるという点です。このスプリントでは、ユーザー、メッセージ、およびチャンネル用のクラスを作成します。クラスが提供してくれる標準化と予測性について理解してもらえるとうれしいです。
Node 用に作成されたいくつかの ORM ライブラリがあることに注意してください。一般的に次の理由により、意図的にそれらを今回使用していません。
- それらのライブラリはまだあまり成熟していません…。単純なユースケースではうまく機能しますが、ほとんどのプロジェクトではすぐに手がつけられなくなります。
- 現実の世界で、ORM がどのように機能するかについて学習してほしいと考えています。
興味を持った人は、おそらく Node で最も人気のある ORM である Bookshelf をチェックしてみましょう。
postgres をインストールする必要があります。もし、まだインストールしていない場合は、PostgresApp をダウンロードしてインストールし、ターミナルで psql
コマンドを実行して postgres が起動していることを確認しましょう。
次を実行して、このプロジェクトのデータベースを作成しましょう:
echo "CREATE DATABASE clack;" | psql
例:
依存パッケージをインストールするには:
yarn
マイグレーションを実行し、データベースをセットアップするには:
yarn migrate
マイグレーションをロールバックするには:
yarn rollback
テストを実行するには:
yarn test
アプリを実行するには:
yarn start
-
これから作成するバックエンドに合わせて、非常にシンプルなクライアントアプリを用意しておきました。
- アプリを表示するために、
yarn start
を使用してアプリを起動しましょう。 - ブラウザで
localhost:3000
に移動しましょう。 - バックエンドはまだ何も動作しないため、機能はかなり制限されてます。ユーザーとして作成/サインインを行えるだけです
- チャンネルの取得、ユーザーの取得、メッセージの送受信を実装する必要があります。
- アプリを表示するために、
-
今回作成するような API をテストするには、Insomnia もしくは Postman のような API をテストするツールがあると便利です。
- ダウンロードして使い慣れておくことをお勧めしますが、使用するかは完全に任意です。
- 完全に慣れるまで 10 分もかかりません。
- ダウンロードして使い慣れておくことをお勧めしますが、使用するかは完全に任意です。
-
20〜30 分程度かけて、リポジトリのレイアウトを理解しましょう。どのように機能するのかという点に特に注目してください。
config.js
に含まれる設定情報はindex.js
内の services に渡されます。models/index.js
は knex を使用してデータベースへの接続を初期化します。データベースへの接続情報はサブモジュールに渡されます。models/users/index.js
が展開され、User
クラスとknex
は、そのモジュールに含まれるすべてのメソッドに渡されます。models/users/create.js
はその依存関係を使用して、serialize
メソッドで同じ標準化された user モデルを返します。controllers/user/index.js
はmodels
メソッドを使用して基本的な CRUD 操作を実行します。
-
テスト(specs)をパスしましょう。
-
models.users.list
が期待どおりに動作するようにしましょう。 -
channels
テーブルを作成するマイグレーションファイルを追加しましょう。knex migrate:make add_channels_table --knexfile models/knexfile.js
を実行して、新しいマイグレーションファイルを作成します。- ファイルに、
id
列とname
列を含める必要があります。 models/migrations/
にある既存のマイグレーションファイルを参考してください。yarn run migrate
でマイグレーションを実行し、yarn run rollback
でマイグレーションをロールバックできます。
-
channels の
list
とcreate
内のメソッドを完成させましょう。 -
マイグレーションファイルを追加して、
channel_messages
テーブルを作成しましょう。knex migrate:make add_channel_messages_table --knexfile models/knexfile.js
を実行して、新しいマイグレーションファイルを作成します。id
、channel_id
、from_id
、message
、sent_at
の列を含める必要があります。
-
channelMessages の
list
とcreate
内のメソッドを完成させましょう。- create メソッドは、新しいメッセージを作成した後、そのチャンネル内のすべての ChannelMessages を返す必要があることに注意してください。
-
マイグレーションファイルを追加して、
user_messages
テーブルを作成しましょう。knex migrate:make add_user_messages_table --knexfile models/knexfile.js
を実行して、新しいマイグレーションファイルを作成します。id
、from_id
、to_id
、message
、sent_at
の列を含める必要があります。
-
特定のユーザーのペアに対する userMessages の
list
とcreate
内のメソッドを完成させましょう。
-
-
ユーザーとチャンネル間の結合テーブルを作成しましょう。
user_id
、channel_id
、read_up_to
(タイムスタンプ)を表示する必要があります。
-
次の動作に対するテストを作成し、実装しましょう:
- ユーザーがチャンネルでメッセージを取得するたびに、
- そのチャネルとユーザーの read_up_to の後に送信されたすべてのメッセージに対して、追加の boolean プロパティに read:false を、残りに read:true をマークします。
- そのユーザーとチャンネルの
read_up_to
を現在の時刻に更新します。
- ユーザーがチャンネルでメッセージを取得するたびに、
-
Bookshelf を使用して、データベースモジュールをすべて書き換えましょう。テストを変更する必要はありません。
-
クライアントアプリに”サインイン”できるようにしましょう。
- このビデオを見て、パスワードを保存する上でのジレンマや、それらをセキュアに保存する方法について学びましょう。
- マイグレーションファイルを追加して、user テーブルに 'password' フィールドを追加しましょう。
- 次の動作に対するテストを作成し、実装しましょう。
- ユーザー名に加えてパスワードを要求するように create メソッドを修正しましょう。
- bcrypt を使用して、パスワードを保存するときにパスワードをハッシュ化します。
- ユーザー名とパスワードを受け取る
authenticate
という名前の users モジュールにメソッドを追加し、データベース内のユーザー名とパスワードを照合します。
何か問題点はありましたか?何か改善すべき点がありましたか?私たちのカリキュラムに貢献しましょう!