【发布时间】:2017-06-02 17:27:52
【问题描述】:
我正在实现一个在线多人游戏,它将通过 socket.io 接收来自客户端的连接。
我不确定在服务器中的何处处理事件 - 无论是在套接字事件侦听器本身中,还是它们是否应该将此逻辑交给动作创建者。
考虑到在许多情况下,从客户端套接字接收事件会从服务器端触发.emit 或.broadcast,因此我需要访问内部的socket 和io处理这个的任何函数。
到目前为止我的解决方案:
商店创建者:
export default io => createStore(
combineReducers({
users,
tables,
games
}),
applyMiddleware(
thunk.withExtraArgument(io),
logger
)
);
使用io 作为额外的thunk 参数创建存储,以便动作创建者可以io.emit 事件,将套接字事件处理程序绑定到store 和io,以便他们可以dispatch、getState 和@ 987654332@:
let store = createStore(io),
//socket event handlers
boundHandlers = [
tables,
games,
messages
].map(handler => handler(store, io));
io.on('connect', users(store, io, boundHandlers));
我的users 高阶函数返回传入连接的事件处理程序并注册之前声明的boundHandlers:
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 **/
}
最后一段代码是我不确定应该在事件侦听器中还是在动作创建器中。
【问题讨论】:
标签: javascript node.js socket.io redux