Работа с маршрутами в Express JS и Socket.io и, возможно, узел в целом

StackOverflow https://stackoverflow.com/questions/8812505

  •  26-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать многоканальное приложение в 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 достаточно умный, чтобы использовать один веб-сокет для этого соединения (по крайней мере, в том, как в использовании).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top