10

ノードを学習しようとして、socket.io でマッシュアップの作成を開始しました。メッセージの転送が開始されましたが、問題が発生しました。

メッセージ イベントが複数回発生し、1 つのメッセージが受信者のボックスに複数回表示されます。ソケットをルーティングしましたがexports.chat、それが問題の原因であるかどうか疑問に思っていましたか?

問題を絞り込むには、メッセージが発火する回数 = クライアントの接続シーケンス。つまり、クライアントが 2 番目に接続すると、そのメッセージは 2 回送信されます。3 番目に接続するクライアントに対して 3 回。

コード スニペットは次のとおりです。

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);
                }
            });
        });
};
4

6 に答える 6

5

だから私は同じ問題を抱えていました。解決策は、socket.on('disconnect') イベントですべてのリスナーを閉じることです。これが私のコードの外観です -

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

切断時に呼び出す必要はないかもしれませんが、確かではありませんが、とにかく呼び出します。

于 2016-05-01T23:11:52.247 に答える
2

この誤動作は、少数の組み込み/予約済みイベント名「メッセージ」の 1 つをアプリケーション固有のメッセージとして使用しようとしているためだと思います。確認するには、イベント名を「message2」などに変更し、問題が解決するかどうかを確認してください。少なくとも「接続」、「切断」、および「メッセージ」は予約されていると思います。https://github.com/LearnBoost/socket.io/wiki/Exposed-events

于 2013-10-03T15:31:34.827 に答える