52
Sails WorkShop (4) 立命館大学 経営学部3回生  井口智勝

Sails workshop4

Embed Size (px)

Citation preview

Page 1: Sails workshop4

Sails WorkShop (4)

立命館大学 経営学部3回生  井口智勝

Page 2: Sails workshop4

SailsWorkShop の目的

<for All>

Watnowにリアルタイム通信技術を導入する

<for One>

取り敢えず、書けるようになること。(スピード重視)

ある程度、体系的な知識化もしていく。

Page 3: Sails workshop4

Sails WorkShop Menu

1回目:Sailsって何?CRUDappを作ろう!

2回目:Policiesの使い方 ~sessionや認証~

3回目:appをリアルタイム化しよう!

4回目:Sails✕Marionette

5回目:細かい部分の共有など...

Page 4: Sails workshop4

※今日は結構 コアにせまります。

Page 5: Sails workshop4

今日のアウトライン

Sails✕Marionetteでどう変わるか?

今回使うMarionetteアプリの説明

Sails✕Marionetteアプリを作ろう!

4回のWorkShopで触れなかった重要部分

2014/12/1(Mon)

Page 6: Sails workshop4

Sails✕Marionetteで どう変わるか?

Sails サーバー ブラウザ

httpリクエスト

htmlとか全て送信

役割重い

Page 7: Sails workshop4

Sails✕Marionetteで どう変わるか?

Sails サーバー Marionette

ブラウザ

非同期通信

JSON

役割軽い!Json返すだけのサーバー

{ user: ‘iguchi’, age: ’21'}

Page 8: Sails workshop4

Sailsサーバーは常にres.jsonでOK!

viewフォルダ必要なくなる。

assetsフォルダもいらない。

リクエストされるURLは決まっているので、blueprintsは全

てfalseでよい。(というかセキュリティ上切るべき。仕組みがわかっているなら、利用することでコード量を減らせる。今回はrestだけ使います。)

Sails✕Marionetteで どう変わるか?

Page 9: Sails workshop4

今日のアウトライン

Sails✕Marionetteでどう変わるか?

今回使うSailsChatアプリの説明

Sails✕Marionetteアプリを作ろう!

4回のWorkShopで触れなかった重要部分

2014/12/15(Mon)

Page 10: Sails workshop4

今回使う SailsChatアプリの説明https://github.com/igtm/SailsChatFront

https://github.com/igtm/SailsChatBack

両者をgrunt sailsliftで立ち上げてみると、、、?

オリジナルアプリです!!

Page 11: Sails workshop4

今日のアウトライン

Sails✕Marionetteでどう変わるか?

今回使うMarionetteアプリの説明

Sails✕Marionetteアプリを作ろう!

4回のWorkShopで触れなかった重要部分

2014/12/15(Mon)

Page 12: Sails workshop4

Sails✕Marionette でappを作ろう!

https://github.com/igtm/SailsChatFront

https://github.com/igtm/SailsChatBack

Page 13: Sails workshop4

環境設定

Page 14: Sails workshop4

front-backの分離に 必要な環境設定

sails.io.jsをmarionetteのvenderに入

れ,init.jsで定義。使うときは、各ファイルで定義する

sails.io.jsのL615を、sailsがある場所に変更。

config/cors.js allRoutes: true

Page 15: Sails workshop4

アプリの大枠説明

Page 16: Sails workshop4

ページ遷移

LoginPage TopPage

Room1

Room2

Room3

Page 17: Sails workshop4

ModelとController

User

Marionette Sails

Chat

User

Chat (永続化するなら必要)

User Controller

Chat Controller

Room Controller

Room

1多

Room (roomを作成削除するようなら

必要)

Page 18: Sails workshop4

Controllerの役割

User Controller

Chat Controller

Room Controller

Userの作成、ログイン

Chatの送信

Roomの入室、退室管理

Page 19: Sails workshop4

Socketによる、データのリアルタイム受け渡し部分

Page 20: Sails workshop4

UserModel

Page 21: Sails workshop4

io.socket.get()

io.socekt.on(‘user’)

marionette Sails

User.subscribe()

User.publishCreate()

switch(msg.verb) - created - destroyed

subscribe

UserModel

私はこういうものです。

新しいユーザーが ログインしたよ!

了解!通知出します!

User.publishDestroy()

ユーザーが ログアウトしたよ!

OK!変更があったら通知するね [create,destroy]

Page 22: Sails workshop4

左上(フロント側)

views/page/LoginItemV.js: L40

modelのsubscribeメソッド(自作)で

io.socket.postしてサーバーに購読させる。

UserModel

Page 23: Sails workshop4

右上(サーバー側)

UserController.jsのsubscribe

L17: 他人のpublishCreateを購読するwatch

L18: 他人の変更(UserModelの

autosubscribeに記載)を購読する。

UserModel

Page 24: Sails workshop4

右下(サーバー側)

UserController.jsのsubscribe

L20: createしたと発行

UserModel

Page 25: Sails workshop4

左下(フロント側)

modules/socket_manager.js

L16: userに変更があったら呼び出し

L19: verbごとに処理を分岐

UserModel

Page 26: Sails workshop4

RoomModel

Page 27: Sails workshop4

io.socket.post()

io.socekt.on(‘room’)

クライアント サーバー

Room.subscribe()

Room.publishAdd()

switch(msg.verb) - addedTo - removedFrom - messaged

enter

RoomModel

私はこういうものです。 OK!変更があったら通知するね [add:users, remove:users,message]

新しいユーザーが 入室したよ!

了解!通知出します!

Room.message()

ユーザーが 投稿したよ!

Page 28: Sails workshop4

左上(フロント側)

TopItemV.js L43

room/:room_id/users/:idにpost

RoomModel

Page 29: Sails workshop4

右上(サーバー側)

RoomController.js L10 enter

L13: room_idで購読。購読する動作は

RoomModelのautosubscribeに記載

RoomModel

Page 30: Sails workshop4

右下(サーバー側)

addToとremoveFromは後で説明

messageは ChatController: L15

RoomModel

Page 31: Sails workshop4

左下(フロント側)

modules.socket_manager

L17: roomに変更があったら呼び出し

L28: verbごとに処理を分岐

RoomModel

Page 32: Sails workshop4

取り敢えずここまで理解していればOK!

Page 33: Sails workshop4

細かい説明

Page 34: Sails workshop4

ModelのAssociations

難易度:★★★★★★★★★★★★★

大袈裟(笑)

Page 35: Sails workshop4

ModelのAssociations

リレーショナル・データベースのジョイントテーブルのようなものを作る機能

Page 36: Sails workshop4
Page 37: Sails workshop4
Page 38: Sails workshop4

ModelのAssociations

仮想属性を設定

相手が1ならmodel: ‘Model名’

相手が多ならcollection: ‘Model名’ via: ‘相手の仮想属性名’

多対多なら片方に優先設定 dominant: true

Page 39: Sails workshop4

modelを結合してデータを得るには?

populate(‘仮想属性’)でmodelを引っ張ってきてくれる。

ModelのAssociations

Page 40: Sails workshop4

Blueprintsの addとremove

難易度:★★★★★

Page 41: Sails workshop4

Blueprintsの add toとremove frompost /model/:id/collection名

で指定実体modelのcollectionにidを追加

delete /model/:id/collection名

で指定実体modelのcollectionにidを削除

Page 42: Sails workshop4

post /model/:id/collection名/:id

勝手に:idを追加してくれて、

publishAddまでしてくれる

Page 43: Sails workshop4

豆知識

Page 44: Sails workshop4

購読の階層Subsequent calls to subscribe are cumulative

今回は特に無しcreate destroy

add:users remove:users

message

UserModel

ログイン時 room入室時

ChatModel

Chat投稿時

RoomModel

Page 45: Sails workshop4

共有化できるモジュール

Page 46: Sails workshop4

Socekt_manager

Socketの変更を受信して、各種命令を出すオ

リジナルmodule

msg.verbで振り分けて、処理。

Page_managerは現在どのページにいるかなどを取得するオリジナルプラグイン

Page 47: Sails workshop4

Finished!!

お疲れ様でした!

Page 48: Sails workshop4

今日のアウトライン

Sails✕Marionetteでどう変わるか?

今回使うMarionetteアプリの説明

Sails✕Marionetteアプリを作ろう!

4回のWorkShopで触れなかった重要部分

2014/12/15(Mon)

Page 49: Sails workshop4

非同期I/O処理

出典:使いたくなる理由2:非同期I/O処理のnode.jsがサーバーリソースを抑える

Page 50: Sails workshop4

非同期I/O通信a()

b()

c()

I/O処理に関して上記関数が順番に実行される保証はない。

Page 51: Sails workshop4

非同期I/O通信

a(b(c()))

コールバックとして書くことで順番が担保される。

⇒コールバック地獄にならないように注意。

Page 52: Sails workshop4

URL一覧

https://github.com/igtm/SailsChatFront

https://github.com/igtm/SailsChatBack

https://github.com/balderdashy/sailsChat