2013-10-03 2 views
6

Я пытался изучить узел и начал создавать mashup с socket.io Начался транспорт сообщений, но я столкнулся с некоторыми проблемами.Socket.io message event firing несколько раз

Событие сообщения срабатывает несколько раз, что приводит к появлению нескольких сообщений в поле получателя. Я направил сокет на exports.chat и задавался вопросом, не вызывает ли это проблема?

Чтобы сузить проблему: сообщения запускают количество раз = последовательность подключения клиента. То есть, если клиент подключается второй, его сообщения будут срабатывать дважды. три раза для клиента, подключающегося третьим.

Вот фрагмент кода:

exports.chat = function(io, pseudoArray, req, res){ 
    res.render('chat', {title: 'ChatPanel.'}); 

     var users = 0; 

     io.sockets.on('connection', function (socket) { // First connection 
      users += 1; 
     // reloadUsers(io, users); 

      socket.on('message', function (data) { // Broadcast the message to all 
       if(pseudoSet(socket)) { 
        var transmit = {date : new Date().toISOString(), pseudo : returnPseudo(socket), message : data}; 
        socket.broadcast.emit('message', transmit); 
        console.log("user "+ transmit['pseudo'] +" said \""+data+"\""); 
       } 
      }); 

      socket.set('pseudo', req.session.user, function(){ 
       pseudoArray.push(req.session.user); 
       socket.emit('pseudoStatus', 'ok'); 
       console.log("user " + req.session.user + " connected"); 
      }); 

      socket.on('disconnect', function() { // Disconnection of the client 
       users -= 1; 
      // reloadUsers(); 
       if (pseudoSet(socket)) { 
        var pseudo; 
        socket.get('pseudo', function(err, name) { 
         pseudo = name; 
        }); 
        var index = pseudoArray.indexOf(pseudo); 
        pseudo.slice(index - 1, 1); 
       } 
      }); 
     }); 
}; 
+0

В вашем обработчике разъединения: часть с псевдо.сликом должна находиться внутри обработчика. –

ответ

5

Вся часть кода socket.io должна выйти за пределы функции external.chat. Socket IO должен связываться с сервером http/app, вы не должны обрабатывать его в каждом запросе.

сообщения обстреливают количество раз = последовательность подключения клиента

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

io.socket.on('message', function (data) {...}) 
+11

Как это было исправлено? – sniper

+0

Я тоже сталкиваюсь с той же проблемой, может ли кто-нибудь помочь мне с этим, как эта проблема была решена, когда я изменил свой код на 'io.sockets.on ('message'' он не работает –

1

Я думаю, что это неправильное поведение, потому что вы пытаетесь использовать один из немногих встроенных/зарезервированных имен событий «сообщение» в качестве сообщения конкретного приложения , Чтобы подтвердить, измените свое имя события на «message2» или что-то еще и посмотрите, не исчезла ли проблема. Я считаю, что по крайней мере «connect», «disconnect» и «message» зарезервированы. https://github.com/LearnBoost/socket.io/wiki/Exposed-events

1

У меня была та же проблема. Решение состоит в том, чтобы закрыть все ваши слушатели на socket.on («разрыв») событие, это то, что мой код выглядит следующим образом -

socket.on('disconnect', function() { 
       socket.removeAllListeners('send message'); 
       socket.removeAllListeners('disconnect'); 
       io.removeAllListeners('connection'); 
      }); 

Может не нужно вызвать его на разъединение, не уверен, но я это делаю так или иначе.

+0

Это фактически не решает проблему когда второй клиент входит в систему .. только когда один клиент отключается. Все еще не исправил мою проблему: / – joe