【问题标题】:Architecting a node.js application around socket.io围绕 socket.io 构建 node.js 应用程序
【发布时间】:2013-01-29 01:55:32
【问题描述】:

我正在基于 websockets 在 Node.js/Express 中编写一个应用程序。我将 Node 的 EventEmitter 与 socket.io 结合使用,用于几乎完全由事件驱动的应用程序。

我想知道这是否是一个好的架构。我的主套接字现在在 app.js 中进行管理,代码如下:

socket.on(Events.InitialFetch, function(battle_id){
    dispatcher.emit(Events.InitialFetch, battle_id);
  });

dispatcher.on(Events.InitialFetched, function(data){
    socket.emit(Events.InitialFetched, data);
  });

...在我的控制器中,我有这样的代码:

dispatcher.on('initial-fetch', function(data){
    Battle.findOne({_id: data})
        .populate('players')
        .populate('owner')
        .exec(function(err, battle){
        if (err) {

        }
        else {
            dispatcher.emit(Events.InitialFetched, battle);
        }
    });
});

而不是正常的 RESTful 路由。我担心的是它有点令人困惑(即描述数据流的'fetch'和'fetched')以及我基本上将方法从一种类型的事件发射器(socket.io)传递给另一种(Event.EventEmitter) .

如何更好地构建它?让控制器直接访问套接字而不是使用 EventEmitter 作为总线会更好吗?如何让我的活动名称更清晰?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    我不会担心使用多个事件发射器。它们是在 Node.js 中构建的一种很好的原语。至于设计,我发现一个很好的问题是我对组件的耦合程度。

    通过为您的控制器使用非 socket.io 事件发射器,Socket.io 是一个独立于控制器的传输。这很好。

    作为最后阶段,您应该使用依赖注入将两者连接在一起。在您的 server.js 文件中创建您的调度程序,然后初始化您的 socket.io 模块,将调度程序作为依赖项传递。

    var dispatcher       = require('./dispatcher')
    var socket_transport = require('./socket_transport')
    
    socket_transport.init_with_dispatcher(dispatcher);
    

    这将使您能够独立于传输测试您的调度程序。调试 socket.io 可能很困难。

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2019-11-07
      • 2012-06-27
      • 1970-01-01
      • 2016-09-04
      • 2017-06-09
      • 2017-11-09
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多