Socket.io消息事件触发多次

我试图学习节点,并开始与socket.io创build混搭。消息传输已经开始,但我遇到了一些麻烦。

消息事件多次触发,导致单个消息在接收者的框中多次出现。 我已经路由到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); } }); }); }; 

socket.io代码的所有部分都必须在external.chat函数之外。 套接字IO必须和http / app服务器绑定,你不应该在每个请求中处理它。

消息正在触发次数=客户端的连接顺序

实际上发生的事情是,每次有新的请求到达时,您都会注册一个消息事件处理程序,因此会被触发多次,就像您访问聊天URL一样。

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

我认为这种不正当行为是因为您试图使用一些内置/保留的事件名称“message”中的一个作为特定于应用程序的消息。 要确认,请将您的事件名称更改为“message2”或其他内容,然后查看问题是否消失。 我相信至less“连接”,“断开”和“消息”保留。 https://github.com/LearnBoost/socket.io/wiki/Exposed-events

所以我有同样的问题。 解决scheme是closures所有的socket.on('disconnect')事件的监听器,这是我的代码看起来像 –

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

可能不需要断开连接,不确定,但我仍然这样做。