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