您每次都在覆盖 app.io。app.io = require('./socket.io/file1');
不是“调用 socket.io”,而是将 app.io 分配给该模块。有多种方法可以解决这个问题,例如:
在 app.js 中:
app.io = [
require('./socket.io/file1'),
require('./socket.io/file2'),
require('./socket.io/file3')
]
在 /bin/www:
app.io.forEach(function (socketIo) {
socketIo.attach(server);
});
这会将一个数组分配给 app.io,然后 /bin/www 遍历该数组以将服务器附加到每个 socket.io 实例。
我无法测试这是否有效,我怀疑它没有(我写它只是为了说明你代码中的第一个问题)。我认为每个 http 服务器只能使用一个 socket.io 实例。但是有一个解决方案:
tl;博士
使用 socket.io命名空间。创建一个 socket.io 实例并将其附加到服务器,就像你已经做的那样,然后io.of("/module-name")
在每个模块文件(如 file1 等)中创建“子模块”。请阅读文档以了解有关命名空间的更多信息。
更新:
还有多种选择,例如:(警告,代码来自我自己的代码库之一,最初是用咖啡脚本编写并在我的脑海中翻译的,但你应该明白要点)
在 io.coffee
var io = require('socket.io')(http)
require('./broadcast.coffee')(io)
require('./livelog.coffee')(io)
当然,http 是您的 http 服务器实例。
在广播.咖啡
module.exports = function (io) {
var broadcast = io.of('/broadcast')
broadcast.on('connection', function (socket) {
socket.emit('foo', 'bar')
})
}