2017-06-02 7 views
0

私はsocket.ioを通してクライアントからの接続を受け取るオンラインマルチプレイヤーゲームを実装しています。サーバーのRedux + socket.io - ビジネスロジックはイベントリスナーまたはアクションクリエイターに属していますか?

私は、ソケットイベントリスナー自体で、またはアクションクリエータにこのロジックを延期する必要がある場合、サーバー内のイベントをどこで処理するのか不明です。

例の多くでは、クライアントソケットからイベントを受信すると、サーバ側から.emitまたは.broadcastをトリガすることを考慮してくださいので、私はこれを扱うどんな関数内socketioへのアクセスを持っている必要があります。これまで

私のソリューション:

ストア作成者:

export default io => createStore(
    combineReducers({ 
     users, 
     tables, 
     games 
    }), 
    applyMiddleware(
     thunk.withExtraArgument(io), 
     logger 
    ) 
); 

は、余分なサンク引数としてioでストアを作成しますので、そのアクションのクリエーターができio.emitイベント、storeへのバインドソケットイベントハンドラとioできるようにdispatch,およびio.emit

let store = createStore(io), 
    //socket event handlers 
    boundHandlers = [ 
     tables, 
     games, 
     messages 
    ].map(handler => handler(store, io)); 

io.on('connect', users(store, io, boundHandlers)); 

着信接続のためのイベントハンドラを返し、boundHandlersは以前に宣言登録マイusers高階関数:コードの

let connections = {}; 

export default ({dispatch, getState}, io, handlers) => async socket => { 
    //close sockets with same session id 
    let sessionId = socket.handshake.session.id; 

    if(connections[sessionId]) 
     connections[sessionId].disconnect(); 

    connections[sessionId] = socket; 

    let userId = /** some authentication logic here **/ 

    //bind event handlers to socket 
    handlers.forEach(handler => handler(socket, userId)); 

    socket 
    //send initial user state 
    .emit('init', userId, getUserState(getState(), userId)) 

    /** other stuff **/ 
} 

この最後の作品は、私はイベントであるべきか分からないものですリスナー、またはアクションクリエイター。

答えて

-1

idiomatic reduxアクションクリエイターは純粋な(副作用なし)ので、非同期ロジックを使用しないようにする必要があります。

私はミドルウェアを書いて、接続を構成し、それに応じてアクションをディスパッチしました。

私はこのためにそこにあるライブラリの数をチェックアウトすることをお勧めします。そのまま使用するか、独自の方法を実装する方法については、アイデアを参考にしてください。 socket.io-reduxのように。

+0

ああ、あなたは純粋で非同期ロジックがない_reducers_を意味します。アクションクリエイターとミドルウェアは、通常副作用が生きる場所です。 – markerikson

+0

この場合、ミドルウェアの有用性は本当にわかりません。一方、私は、クライアントから/へのメッセージの受信/送信に関するすべてのコードがソケットイベントリスナーになければならず、ビジネスロジックがアクションクリエイターになければならないという結論に達しました。それは合理的なようですか? – Thiatt

+0

私は最初の質問は、 "ビジネスロジック"として何を定義しているのでしょうか? FWIWには、[アクションクリエイターとレデューサーの間のビジネスロジックの分割に関するRedux FAQのエントリ](http://redux.js.org/docs/faq/CodeStructure.html#structure-business-logic)があります。第2に、ミドルウェアは、 'dispatch'、' getState'、およびディスパッチパイプラインへのアクセスを持つ永続的な場所を形成するので、Reduxのソケットとやり取りするのに適しています。既存のソケットミドルウェアは数多くあります - https://github.com/markerikson/redux-ecosystem-links/blob/master/middleware-sockets-adapters.mdを参照してください。 – markerikson

関連する問題