【问题标题】:Redux + socket.io in the server - Does business logic belong in event listeners or action creators?服务器中的 Redux + socket.io - 业务逻辑是否属于事件侦听器或动作创建者?
【发布时间】:2017-06-02 17:27:52
【问题描述】:

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

我不确定在服务器中的何处处理事件 - 无论是在套接字事件侦听器本身中,还是它们是否应该将此逻辑交给动作创建者。

考虑到在许多情况下,从客户端套接字接收事件会从服务器端触发.emit.broadcast,因此我需要访问内部的socketio处理这个的任何函数。

到目前为止我的解决方案:

商店创建者:

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

使用io 作为额外的thunk 参数创建存储,以便动作创建者可以io.emit 事件,将套接字事件处理程序绑定到storeio,以便他们可以dispatchgetState 和@ 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


    【解决方案1】:

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

    我编写了中间件来配置连接并相应地调度操作。

    我建议您查看为此提供的众多库之一。要么按原样使用,要么就如何实现自己的想法。喜欢socket.io-redux

    【讨论】:

    • 啊...你的意思是 reducers 应该是纯粹的并且没有异步逻辑。动作创建者和中间件是副作用通常存在的地方,
    • 在这种情况下,我真的看不出中间件的用处。同时,我得出的结论是,与从/向客户端接收/发送消息有关的所有代码都应该在套接字事件侦听器中,而业务逻辑应该在动作创建者中。这看起来合理吗?
    • 我猜第一个问题是,您将什么定义为“业务逻辑”? FWIW,有一个Redux FAQ entry on "splitting business logic between action creators and reducers"。其次,中间件是与 Redux 中的套接字交互的正确位置,因为它们形成了一个持久位置,可以访问 dispatchgetState 和调度管道。现有的套接字中间件有几十个 - 请参阅 github.com/markerikson/redux-ecosystem-links/blob/master/…
    • io.on('connect') 例如。当客户端连接时,我必须对它们进行身份验证并检索它们的会话(以防连接断开或其他情况)。此逻辑是否发生在“连接”事件侦听器中,还是只是调用处理它的 userConnect 操作创建者?
    • 换句话说,立即将套接字事件传送到dispatch 并在中间件中处理它、让事件侦听器处理逻辑并分派一个瘦动作创建者之间有什么区别?事件监听器调用一个胖动作创建者来处理它们的逻辑并调度?
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多