【问题标题】:Node.js Express 4 Generator with Mutliple Socket.io files带有多个 Socket.io 文件的 Node.js Express 4 生成器
【发布时间】:2016-01-02 02:07:19
【问题描述】:

我将我的应用程序分解为模块,以便将来添加到其中。我将 express 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 每次我调用它时都会重置。

解决这个问题的最佳方法是什么?我想让我的代码尽可能地分解。

【问题讨论】:

  • 为每个模块制作不同的 server.js 文件

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


【解决方案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')
]

在 /bin/www:

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

这会将一个数组分配给 app.io,然后 /bin/www 遍历该数组以将服务器附加到每个 socket.io 实例。

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

tl;dr

使用 socket.io namespaces。创建一个 socket.io 实例并将其附加到服务器,就像你已经做的那样,然后通过 io.of("/module-name") 在每个模块文件(如 file1 等)中创建“子模块”。请阅读文档以了解有关 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')
    })
}

【讨论】:

  • 这完全有道理。我已经在我的代码中使用了命名空间。我想要做的是让我的 socket.io 模块根据我的路线分解。我相信按照您推荐的方法进行操作将使我能够做到这一点。在这一点上,我不确定如何在基于单个 io.js 文件触发该路由时触发该模块。
  • 工作就像一个魅力!感谢您更新示例。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
相关资源
最近更新 更多