Node.js Express 4 Generator with Mutliple Socket.io files



我将我的应用程序分解为多个模块,以便将来添加到其中。我在生成器中使用express 4,在添加多个socket.io侦听器时遇到问题。

In/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每次调用都会重置。

对此最好的方法是什么?我想让我的代码尽可能地分解。

您每次都会覆盖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')
]

in/bin/www:

app.io.forEach(function (socketIo) {
    socketIo.attach(server);
});

这将一个数组分配给app.io,/bin/www在数组上迭代,将服务器连接到每个socket.io实例。

我无法测试这是否有效,我怀疑它不有效(我写它只是为了说明代码中的第一个问题)。我认为每个http服务器只能使用一个socket.io实例。但有一个解决方案:

tl;dr

使用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服务器实例。

在broadcast.coffee

module.exports = function (io) {
    var broadcast = io.of('/broadcast')
    broadcast.on('connection', function (socket) {
        socket.emit('foo', 'bar')
    })
}

最新更新