私は node.js の世界に入ろうとしており、ストアとして redis を使用して node.js を socket.io および backbone.js に接続するためのシンプルだが完全なテスト アプリを構築したいと考えています。いくつかのチュートリアルといくつかの例も見つけました。どういうわけか、使用しなければならないアーキテクチャ全体について混乱してしまいます。通常は、server.js 内のすべてのルートを Express で定義します。したがって、サーバー側でルートを完全に制御できます。バックボーンをリンクするために、ルートを再度定義する必要がありますか? これはモデル的な側面のように思えますが、私にとってはダブルワークのようで、なんとなく嫌いです。それで、私は混乱しただけで、物事は完全に異なって動作するのでしょうか? 誰かが、より明確になった優れたチュートリアルまたは例へのリンクを持っているかもしれません。
2 に答える
バックボーンをリンクするために、ルートを再度定義する必要がありますか?
ルートの意味によって異なります。
サーバーリソースを見つける場所をバックボーンに伝える必要があるため、モデルがそれを取得する場所を伝えるのは理にかなっています (モデルの url パラメーター)。
バックボーンのルート クラスは、サーバー上のルートとは関係ありません。これは、アプリケーションの状態またはページ内に表示されるビューを変更するための手段にすぎません。
たとえば、LOB アプリにはリスト ビューと詳細ビューがあります。
backbone を使用すると、ページを更新せずにルーター経由でビューを切り替えることができます。
リストの URL はhttp://app.com/#list、詳細ビューの URL はhttp://app.com/#detail/:idのようになります。idは製品 ID です。として定義されたリンクをクリックするだけで、ページを更新せずにビューを切り替えることができます。
<a href="#detail/1">product 1</a>
リストビューに戻ります
<a href="#list">product list</a>
次に、製品フォームを表示するビューを作成できます
<a href="#newproduct">Create a new product</a>
等々。そのため、ビューにイベントリスナーを設定して、お互いを認識してはならないビュー間を切り替える必要はなく、サーバーに何も要求せず、ページを更新する必要もありません。これは、アプリケーションを構成する便利な方法です。
フロントエンドのバックボーン モデルに似たものを使用しています
class Model extends Backbone.Model
idAttribute: '_id'
_sync: (method, model, options) =>
options.data ?= {}
@socket.emit method, @name(), model.toJSON(), options.data, (err, data) =>
if err then console.error "error in sync with #{method} #{@.name()} with server (#{err})" else options.success(data)
sync: (method, model, options) =>
if @socket.connected() is no
@socket.once 'connect', => @_sync method, model, options
else
@_sync method, model, options
name: =>
if @collection and @collection.name then return @collection.name else throw new Error "Socket model has no name (#{@.collection})"
initialize: ->
@socket = require('socket')
module.exports = Model
そして、これが私の基本的なバックボーン コレクションです
class Collection extends Backbone.Collection
model: require('class/socket/model')
_sync: (method, collection, options) =>
@socket.emit method, @.name, collection.toJSON(), options.data, (err, data) =>
if err then console.error "error in sync with #{method} #{@.name} with server (#{err})" else options.success(data)
sync: (method, collection, options) =>
if @socket.connected() is no
@socket.once 'connect', => @_sync method, collection, options
else
@_sync method, collection, options
garbage: false
register: =>
@socket.emit 'register', @name
deregister: =>
@socket.emit 'deregister', @name
@garbage = true
initialize: (options) ->
@name = options.name if options and options.name
if !@name then throw new Error 'Socket collection has no name'
@socket = require('socket')
# Registrating socket for connection
@socket.on 'connect', => @register() if @garbage is off
if @socket.connected() is yes then @register()
@fetch()
# Registration for socket events for this collection
@socket.on @name, (method, model) =>
if method is 'reset'
@reset(model)
if method is 'delete'
m = @get model._id
m.trigger 'destroy', m, m.collection
if method is 'update'
m = @get model._id
m.set(model)
if method is 'create'
@add(model)
console.log "SOCKET: " + method + " triggered for collection " + @name
module.exports = Collection;
よろしければCoffeeScriptです。
私が見たすべてのチュートリアルでは、コレクションの登録/登録解除を使用しています。
重要なことは、これらのコレクションとモデルを使用してバックエンドに認証を導入する方法を見つけることです。それほど難しいことではありませんが、トリッキーです。
また、同じユーザーが 2 つのソケット接続を管理する場合にも注意してください。ソケットの更新を同じユーザーに送信する必要がありますが、他の接続に送信する必要があります。