Node.js Express 4 Generator with Mutliple Socket.io文件

时间:2016-01-02 02:07:20

标签: node.js socket.io express-4 express-generator

我将我的应用程序分成了模块,以便将来添加到它中。我使用快速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都会重置。

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

1 个答案:

答案 0 :(得分:1)

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

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')
    })
}