javascript - Socket.io 消息事件多次触发

标签 javascript node.js socket.io

我正在尝试学习 node 并开始使用 socket.io 创建混搭 消息传输已经开始,但我遇到了一些麻烦。

消息事件多次触发,导致一条消息在收件人的框中多次出现。我已将套接字路由到 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 函数之外。 Socket IO 必须与 http/app 服务器绑定(bind),你不应该在每个请求中处理它。

the messages are firing the number of times = the sequence of connection of the client

本质上发生的是,每次新请求到达时,您都会为消息注册一个事件处理程序,因此它会在您访问聊天 URL 时触发多次。

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

关于javascript - Socket.io 消息事件多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19162582/

相关文章:

javascript - Parsley.js 在提交时跳过验证?

javascript - jquery ul切换问题

node.js - Express.js hbs 模块 - 从 .hbs 文件注册部分

postgresql - 使用 node-postgres 监听查询超时?

javascript - JavaScript套接字连接到端口43(Whois)

javascript - 拼接后Javascript覆盖数组索引

javascript - 处理打印对话框的 'Close'事件

php - 通过触发提交按钮之一来提交 jquery 中的表单

mysql - Node.js - 并发 SQL 查询导致服务器崩溃

node.js - Nodejs - Socketio 无法与 https 服务器一起使用,可能是什么原因?