Javascript Redux+;服务器中的socket.io-业务逻辑属于事件侦听器还是操作创建者?

Javascript Redux+;服务器中的socket.io-业务逻辑属于事件侦听器还是操作创建者?,javascript,node.js,socket.io,redux,Javascript,Node.js,Socket.io,Redux,我正在实现一个在线多人游戏,它将通过socket.io接收来自客户端的连接 我不确定在服务器中处理事件的位置——要么在套接字事件侦听器中,要么他们是否应该将此逻辑推迟到动作创建者 考虑到在许多情况下,从客户端套接字接收事件将触发服务器端的.emit或.broadcast,因此我需要在处理此问题的任何函数中访问套接字和io 我目前的解决方案: 商店创建者: export default io => createStore( combineReducers({ user

我正在实现一个在线多人游戏,它将通过socket.io接收来自客户端的连接

我不确定在服务器中处理事件的位置——要么在套接字事件侦听器中,要么他们是否应该将此逻辑推迟到动作创建者

考虑到在许多情况下,从客户端套接字接收事件将触发服务器端的
.emit
.broadcast
,因此我需要在处理此问题的任何函数中访问
套接字
io

我目前的解决方案:

商店创建者:

export default io => createStore(
    combineReducers({
        users,
        tables,
        games
    }),
    applyMiddleware(
        thunk.withExtraArgument(io),
        logger
    )
);
使用
io
作为额外的thunk参数创建存储,以便操作创建者可以
io.emit
事件,将套接字事件处理程序绑定到
store
io
,以便它们可以
dispatch
getState
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));
My
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 **/
}

最后一段代码我不确定是否应该在事件侦听器或动作创建者中。

在惯用的redux中,动作创建者应该是纯的(没有副作用),这意味着它们不受异步逻辑的影响

我编写了中间件来配置连接并相应地分派操作


我建议你在众多的图书馆中找一个来做这个。要么按原样使用,要么就如何实现自己的想法。就像。

啊。。。你的意思是,还原程序应该是纯的,没有异步逻辑。动作创建者和中间件是副作用通常存在的地方,在这种情况下,我看不出中间件的用处。同时,我得出结论,所有与从客户机接收/发送消息相关的代码都应该在套接字事件侦听器中,而业务逻辑应该在操作创建者中。这看起来合理吗?我想第一个问题是,您将什么定义为“业务逻辑”?FWIW,有一个。其次,中间件是与Redux中的套接字交互的正确位置,因为它们形成了一个持久位置,可以访问
调度
获取状态
,以及调度管道。现有的套接字中间件有几十种,例如参见。
io.on('connect')
。当客户端连接时,我必须对它们进行身份验证并检索它们的会话(以防连接断开或其他情况)。这种逻辑是发生在“connect”事件侦听器内部,还是仅仅调用处理它的
userConnect
操作创建者?换句话说,将套接字事件立即传输到
dispatch
和在中间件中处理它有什么区别,让事件侦听器处理逻辑并分派瘦动作创建者,还是让事件侦听器调用胖动作创建者来处理逻辑并分派?