私はsocket.ioを通してクライアントからの接続を受け取るオンラインマルチプレイヤーゲームを実装しています。サーバーのRedux + socket.io - ビジネスロジックはイベントリスナーまたはアクションクリエイターに属していますか?
私は、ソケットイベントリスナー自体で、またはアクションクリエータにこのロジックを延期する必要がある場合、サーバー内のイベントをどこで処理するのか不明です。
例の多くでは、クライアントソケットからイベントを受信すると、サーバ側から.emit
または.broadcast
をトリガすることを考慮してくださいので、私はこれを扱うどんな関数内socket
とio
へのアクセスを持っている必要があります。これまで
私のソリューション:
ストア作成者:
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 **/
}
この最後の作品は、私はイベントであるべきか分からないものですリスナー、またはアクションクリエイター。
ああ、あなたは純粋で非同期ロジックがない_reducers_を意味します。アクションクリエイターとミドルウェアは、通常副作用が生きる場所です。 – markerikson
この場合、ミドルウェアの有用性は本当にわかりません。一方、私は、クライアントから/へのメッセージの受信/送信に関するすべてのコードがソケットイベントリスナーになければならず、ビジネスロジックがアクションクリエイターになければならないという結論に達しました。それは合理的なようですか? – Thiatt
私は最初の質問は、 "ビジネスロジック"として何を定義しているのでしょうか? 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