Trabajar con rutas en Express JS y Socket.io y tal vez Node en general
Pregunta
Estoy tratando de escribir una aplicación múltiple en Socket.io. El canal en el que se encuentra debe definirse por la URL en la que se encuentra. Si hago la parte de unión en la App.js con valores permanentes, todo funciona. Tan pronto como lo cambie para que la ruta para la ruta. La página realice la unión, obtengo el error, que los enchufes no están disponibles en el contexto. ¿Cuál sería la forma correcta para que pueda unir dinámicamente al canal?
/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 );
});
};
Solución
La forma más fácil de hacer múltiples canales es de diferentes URL.
Por ejemplo, tengo al cliente que haga lo siguiente:
io.connect('/game/1')
io.connect('/system')
y en el servidor tengo
io.of('/game/1').on('connect' function(socket) {...})
io.of('/system').on('connect' function(socket) {...})
Parece que me estoy conectando dos veces aquí, pero Socket.io es lo suficientemente inteligente como para usar un solo websock para esta conexión (al menos lo dice en el uso de cómo hacer).