围绕socket.io构build一个node.js应用程序

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

我想知道这是不是一个好的build筑。 我的主要套接字现在在app.js中进行pipe理,并具有如下代码:

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路由。 我的担心是有点混淆(即“提取”和“提取”用于描述数据stream),事实上,我基本上是从一种types的事件发射器(socket.io)传递方法到另一个(Event.EventEmitter) 。

这怎么能更好地架构? 让控制器直接访问套接字而不是使用EventEmitter作为总线会更好吗? 我怎样才能让我的事件的名字更清楚?

我不会担心使用多个事件发射器。 在Node.js中构build它们是很原始的。 至于devise,我发现一个很好的问题就是我的组件有多深。

通过使用控制器的nonsocket.io事件发射器,Socket.io是来自控制器的独立传输。 这很好。

作为最后阶段,您应该使用dependency injection将两者连接在一起。 在你的server.js文件中创build你的调度器,然后初始化你的socket.io模块,通过调度器作为依赖。

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

这将让您独立于运输testing您的调度员。 debuggingsocket.io可能很困难。