我将我的应用程序分成了模块,以便将来添加到它中。我使用快速4与生成器,并遇到添加我的多个socket.io监听器的问题。
在/ bin / www
app.io.attach(server);
在app.js
var app = express();
//call socket.io to the app for each route
app.io = require('./socket.io/file1');
app.io = require('./socket.io/file2');
app.io = require('./socket.io/file3');
在我尝试添加多个socket.io源文件之前,一切都很顺利。然后只有最后一个工作。我假设因为每次调用app.io都会重置。
最好的方法是什么?我想尽可能地保持我的代码分解。
答案 0 :(得分:1)
你每次都在覆盖app.io. app.io = require('./socket.io/file1');
不是“调用socket.io”,而是将app.io分配给该模块。有多种方法可以解决这个问题,例如:
:
app.io = [
require('./socket.io/file1'),
require('./socket.io/file2'),
require('./socket.io/file3')
]
app.io.forEach(function (socketIo) {
socketIo.attach(server);
});
这会将数组分配给app.io和/ bin / www遍历数组,以将服务器附加到每个socket.io实例。
我无法测试这是否有效,我怀疑它没有(我写的只是为了说明代码中的第一个问题)。我认为每个http服务器只能使用一个socket.io实例。但有一个解决方案:
<强> TL;博士强>
使用socket.io namespaces。创建一个socket.io实例并将其附加到服务器上,然后在每个模块文件(如file1等)中通过io.of("/module-name")
创建“子模块”。请阅读文档以了解有关namespaces的更多信息。
更新
还有多个选项可以做到这一点,例如:(警告,代码来自我自己的代码库之一,最初用咖啡脚本编写并翻译成我的头脑,但你应该得到要点)
在io.coffee中
var io = require('socket.io')(http)
require('./broadcast.coffee')(io)
require('./livelog.coffee')(io)
http当然是你的http服务器实例。
在broadcast.coffee中
module.exports = function (io) {
var broadcast = io.of('/broadcast')
broadcast.on('connection', function (socket) {
socket.emit('foo', 'bar')
})
}