在express和js和socket.io中使用路由,也可能在一般情况下使用节点

我正尝试在socket.io中编写一个多通道应用程序。 您所在的频道应该由您所在的url来定义。 如果我做永久值的app.jsjoin部分一切正常。 只要我改变它,以便route.page的路由进行连接,我得到的错误,该上下文中不可用套接字。 什么是正确的方式,以便我可以dynamicjoin频道?

/app.js

var io = socketio.listen(app); require('./io')(io); io.sockets.on('connection', function (socket) { socket.on('debug', function (message) { socket.get('channel', function (err, name) { socket.in(name).broadcast.emit('debug', message); }); }); }); 

/io.js

 var socketio = function (io) { if (!io) return socketio._io; socketio._io = io; } module.exports = socketio; 

/routes/index.js

 var io = require('../io')(); exports.page = function(req, res){ var channel = req.params.id; res.render('page', { title: 'PAGE', channel: channel }); io.sockets.on('connection', function (socket) { socket.join(channel); socket.set('channel', channel ); }); }; 

我发现做多个渠道最简单的方法是closures不同的url。

例如,我有客户端执行以下操作:

 io.connect('/game/1') io.connect('/system') 

并在我的服务器上

 io.of('/game/1').on('connect' function(socket) {...}) io.of('/system').on('connect' function(socket) {...}) 

看起来我在这里连接了两次,但是socket.io足够聪明,可以为这个连接使用一个websocket(至less在使用方法中是这样说的)。