Работа с маршрутами в Express JS и Socket.io и, возможно, узел в целом
Вопрос
Я пытаюсь написать многоканальное приложение в Socket.io. Канал, в котором вы находитесь, должен быть определен URL, на котором вы находитесь. Если я сделаю присоединяющуюся часть в app.js с постоянными значениями, все работает. Как только я меняю его так, чтобы маршрут для маршрута. Страница делает соединение, я получаю ошибку, что розетки не доступны в контексте. Каким был бы правильный способ, чтобы я мог динамически присоединиться к каналу?
/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 );
});
};
Решение
Самый простой способ, который я обнаружил, выполнять несколько каналов, - это разные 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 достаточно умный, чтобы использовать один веб-сокет для этого соединения (по крайней мере, в том, как в использовании).