Giter Club home page Giter Club logo

sprint.database-part-2's Introduction

データベース パート II. Clack の構築

This was created during my time as a Code Chrysalis Student

目次

  1. 前書き
  2. はじめに
  3. トピックの概要
    1. Knex
    2. マイグレーション
    3. ORMs
  4. 環境設定
    1. 依存パッケージのインストールとスタートアップ
  5. 課題と手順について
    1. 基礎レベル
    2. 追加の課題
  6. 参考資料
  7. コントリビューション

前書き

このプロジェクトは以前見てきたものよりも複雑で、CC を卒業して最初の職を得て、あるタスクを任された場合を想定しています。圧倒されてしまうのが 普通 です。

あなたをサポートするために、いくつかの指針を以下に示します:

  • 大規模なプロジェクトでは、別のチームに所属したり、開発者が別のタスクやプロジェクトの一部を作業することになるため、すべてを理解するための十分な時間がありません。
  • 特定のタスクを持ち、あなたが作業する必要のある箇所がコードベースの どこにあるか 見つけることを優先する必要が出てくるでしょう。
  • VSCode はあなたの友達です。必要な箇所を見つけるために、CMD + P を使用してファイル間をすばやく移動し、”マイグレーション”などの用語を検索しましょう。
  • あなたはすべてを把握していなくても気にならないようになる必要があります、覚えておいてください:Conjure, CONJURE, CONJURE

はじめに

このスプリントの後半では、よくあるチャットアプリで、アプリのビジネスロジックとデータベースを統合する方法について説明します。デファクトスタンダードである knex を使用して Node で SQL を記述して、マイグレーションと、常に データベースを意識せずにビジネスロジックを記述できるようにシンプルな ORM を書く方法について見ていきます。シンプルなチャットアプリである Clack - The Crappy Slack のバックエンドを構築します。ユーザは以下の操作を行うことができます:

  • お互いにメッセージを送受信する。
  • チャンネルを作成する。
  • チャンネルに参加する。
  • 参加したチャンネルからメッセージを送受信する。

このスプリントでは、ルーティングとフロントエンドに関しては、あなたのためにほとんど用意しておきました。今回の課題では、ほとんどの時間を ./services/db/* に注力しましょう。

トピックの概要

Knex

このスプリントの前半では、生の SQL を記述してデータベースとやり取りをしました。ご想像のとおり、これは時として苦痛であるため、SQL をより javascript ライクな方法で記述できるライブラリを使用して Node でデータベースとやり取りすることをお勧めします。Knex はこのためのデファクトスタンダードなライブラリであり、このスプリントでは Knex を頻繁に利用します。Knex のドキュメントを頻繁に読むことになるため、ドキュメントを 1 つのタブに開いたままにしておくことをお勧めします。簡単に言うと、knex はクエリビルダーです。つまり、Knex は、通常の Javascript でクエリを記述し、それを SQL に変換することができます。恐れてはいけません。それを受け入れましょう。

マイグレーション

マイグレーションについては、前半のスプリントの追加課題で説明しましたが、前回それに取り組んでいなくても問題ありません。-- ここでもう一度説明します。

テーブルのスキーマを変更するたびに、マイグレーション内でスキーマの変更を行います。マイグレーションとは、何らかの方法でスキーマを変更し、新しいスキーマに適合するようにデータを修正する一連のクエリです。マイグレーションは 常に トランザクション内で行われるべきです。トランザクションについてよくわからない場合は、前のスプリントの追加課題の説明を読むことで、このスプリントで必要となるトランザクションについて理解することができます。

困った時は、必要であればトランザクションに関するこの短いチュートリアルを試してみましょう。

ORMs

ORM はオブジェクト関係マッピング(Object Relational Mapping)の略であり、データベースの出力結果をオブジェクトに変換します。データベースの出力結果とオブジェクトの違いは、オブジェクトはメソッドを持つことができ、そのメソッドはあらゆる種類の処理を実行するのに利用されるという点です。このスプリントでは、ユーザー、メッセージ、およびチャンネル用のクラスを作成します。クラスが提供してくれる標準化と予測性について理解してもらえるとうれしいです。

Node 用に作成されたいくつかの ORM ライブラリがあることに注意してください。一般的に次の理由により、意図的にそれらを今回使用していません。

  • それらのライブラリはまだあまり成熟していません…。単純なユースケースではうまく機能しますが、ほとんどのプロジェクトではすぐに手がつけられなくなります。
  • 現実の世界で、ORM がどのように機能するかについて学習してほしいと考えています。

興味を持った人は、おそらく Node で最も人気のある ORM である Bookshelf をチェックしてみましょう。

環境設定

Postgres

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.jsmodels メソッドを使用して基本的な 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 の listcreate 内のメソッドを完成させましょう。

    • マイグレーションファイルを追加して、channel_messages テーブルを作成しましょう。

      • knex migrate:make add_channel_messages_table --knexfile models/knexfile.js を実行して、新しいマイグレーションファイルを作成します。
      • idchannel_idfrom_idmessagesent_atの列を含める必要があります。
    • channelMessages の listcreate 内のメソッドを完成させましょう。

      • create メソッドは、新しいメッセージを作成した後、そのチャンネル内のすべての ChannelMessages を返す必要があることに注意してください。
    • マイグレーションファイルを追加して、user_messages テーブルを作成しましょう。

      • knex migrate:make add_user_messages_table --knexfile models/knexfile.js を実行して、新しいマイグレーションファイルを作成します。
      • idfrom_idto_idmessagesent_at の列を含める必要があります。
    • 特定のユーザーのペアに対する userMessages の listcreate 内のメソッドを完成させましょう。

追加課題

  • ユーザーとチャンネル間の結合テーブルを作成しましょう。

    • user_idchannel_idread_up_to(タイムスタンプ)を表示する必要があります。
  • 次の動作に対するテストを作成し、実装しましょう:

    • ユーザーがチャンネルでメッセージを取得するたびに、
      • そのチャネルとユーザーの read_up_to の後に送信されたすべてのメッセージに対して、追加の boolean プロパティに read:false を、残りに read:true をマークします。
      • そのユーザーとチャンネルの read_up_to を現在の時刻に更新します。
  • Bookshelf を使用して、データベースモジュールをすべて書き換えましょう。テストを変更する必要はありません。

  • クライアントアプリに”サインイン”できるようにしましょう。

    • このビデオを見て、パスワードを保存する上でのジレンマや、それらをセキュアに保存する方法について学びましょう。
    • マイグレーションファイルを追加して、user テーブルに 'password' フィールドを追加しましょう。
    • 次の動作に対するテストを作成し、実装しましょう。
      • ユーザー名に加えてパスワードを要求するように create メソッドを修正しましょう。
      • bcrypt を使用して、パスワードを保存するときにパスワードをハッシュ化します。
      • ユーザー名とパスワードを受け取る authenticate という名前の users モジュールにメソッドを追加し、データベース内のユーザー名とパスワードを照合します。

参考資料

コントリビューション

何か問題点はありましたか?何か改善すべき点がありましたか?私たちのカリキュラムに貢献しましょう

sprint.database-part-2's People

Contributors

zowie0122 avatar mia-the-coding-cat avatar

Watchers

Garrett Chun avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.