Соединения дублируются в Socket.io

0

Я разрабатываю приложение для чата, и соединения дублируются.

На моем пути у меня есть:

exports.index = function (io) {

  return function (req, res) {

    var userId;

    res.render('index', {
      title: 'RandomChat.me',
      test: 'test2'
    });

    io.sockets.on('connection', function (socket) {

      userId = socket.id;
      console.log("+++++++++++++++++++" + userId);
      socket.emit('addUser', { userId: userId });
      socket.room = 'General';
      socket.join(socket.room);

      socket.on('sendMessage', function (data) {
        console.log(data.room);
        // socket.broadcast.emit('receiveMessage', { data: data });
        socket.broadcast.to(data.room).emit('receiveMessage', { message: data.message });
      });

    });

  }

};

Клиентская сторона что-то вроде:

  var socket = io.connect('http://domain.com:3000'); 
  var userId;

  socket.on('addUser', function(data) {
    userId = data.userId;
    console.log(userId);
  });

  socket.on('receiveMessage', function (data) {
    console.log(data);
  });

  var room: "General";
  var message: "Test";
  socket.emit('sendMessage', { room : room, message: message });
  console.log(userId + " " + message)

Если я прихожу к приложению и проверяю консольный журнал, я вижу userId, и когда я перезагружаю страницу, я дважды вижу один и тот же идентификатор, если снова перезагружаюсь, я вижу его 3 раза и так далее.

То же самое происходит в консоли node.js.

Таким образом, в основном, когда соединения/пользователи дублируются, другие пользователи получают повторяющиеся сообщения, так как функции sendMessage/receiveMessages выполняются более одного раза.

Помогите оценить.

Теги:
socket.io

2 ответа

0
Лучший ответ

Проблема в этой строке

io.sockets.on('connection', function (socket) {

Вы не должны помещать их внутри обработчика запроса, потому что просто неправильно добавить обработчик соединения для сокета для каждого запроса. Попробуйте сделать это за пределами обработчика запросов и использовать io-объект для передачи/трансляции событий в сокеты из обработчика запросов.

0

Использование io.sockets.once('connection', function (data){}) вместо io.sockets.on('connection', function (data){}) исправлено. Он не пытается восстановить потерянное соединение.

  • 0
    Вероятно, не самый лучший способ, как будто я перезагружаю сервер узла, тогда соединение не восстанавливается.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню