围绕socket.io构建node.js应用程序

时间:2013-01-28 17:22:33

标签: node.js socket.io

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

1 个答案:

答案 0 :(得分:2)

我不担心使用多个事件发射器。它们是在Node.js中构建的善良原始的。至于设计,我发现一个很好的问题是我有多深入地耦合我的组件。

通过为控制器使用nonsocket.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可能很困难。