Работа с маршрутами в экспресс-js и socket.io и, возможно, в целом нода - PullRequest
4 голосов
/ 11 января 2012

Я пытаюсь написать многоканальное приложение в socket.io. Канал, в котором вы находитесь, должен определяться URL, на котором вы находитесь. Если я делаю присоединяющуюся часть в app.js с постоянными значениями, все работает. Как только я изменяю это так, чтобы маршрут для route.page выполнял соединение, я получаю ошибку, что сокеты не доступны в контексте. Что было бы правильно, чтобы я мог динамически присоединиться к каналу?

/ 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;

/ маршруты / 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 );
  });
};

1 Ответ

3 голосов
/ 16 января 2012

Я обнаружил, что проще всего использовать несколько каналов, используя разные URL-адреса.

Например, у меня есть клиент, который делает следующее:

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

и на сервере Ihave

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

Похоже, я здесь дважды подключаюсь, но socket.io достаточно умен, чтобы использовать для этого соединения одну веб-розетку (по крайней мере, так сказано в руководстве по использованию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...