2

我正在基于 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 作为总线会更好吗?如何使我的活动名称更清晰?

4

1 回答 1

2

我不会担心使用多个事件发射器。它们是在 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 可能很困难。

于 2013-01-28T17:55:32.170 回答