Node.js 具有多个 Socket.io 文件的 Express 4 生成器
Node.js Express 4 Generator with Mutliple Socket.io files
我将我的应用程序分解成模块以便将来添加。我将 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 每次我调用它时都会重置。
解决此问题的最佳方法是什么?我想尽可能地分解我的代码。
你每次都在覆盖 app.io。 app.io = require('./socket.io/file1');
不是 "calling 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.ionamespaces. Create a single instance of socket.io and attach it to the server like you already do, then create "submodules" via io.of("/module-name")
in each of your module files (like file1, etc). Please read the documentation to learn more about namespaces.
更新:
同样有多个选项可以做到这一点,例如:(警告,代码来自我自己的代码库之一,最初是用 coffee-script 编写并在我的脑海中翻译的,但你应该明白要点)
在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')
})
}
我将我的应用程序分解成模块以便将来添加。我将 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 每次我调用它时都会重置。
解决此问题的最佳方法是什么?我想尽可能地分解我的代码。
你每次都在覆盖 app.io。 app.io = require('./socket.io/file1');
不是 "calling 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.ionamespaces. Create a single instance of socket.io and attach it to the server like you already do, then create "submodules" via io.of("/module-name")
in each of your module files (like file1, etc). Please read the documentation to learn more about namespaces.
更新:
同样有多个选项可以做到这一点,例如:(警告,代码来自我自己的代码库之一,最初是用 coffee-script 编写并在我的脑海中翻译的,但你应该明白要点)
在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')
})
}