2017-06-20 3 views
1

私はSocket.ioで簡単なチャットルームを構築しています。ユーザは所望のユーザ名を入力し、フォームを送信する。私のSocket.ioイベントが何回も起動しているのはなぜですか?

私はチャットに現在あるユーザーごとに発射しているようで、ユーザ名が使用されているかどうかをチェックして、ユーザ名が利用可能な場合joinイベントを発生、チャットに追加されますが、joinイベント - ありません新しいユーザーがそれを入力するたびに1回。

var socket = io(); 

// user enters desired username and submits form 
$('#chat__join').on('submit', function() { 

    // get username value 
    var name = $('#chat__name').val(); 

    // send socket username to check if someone is already using it 
    socket.emit('isUserInChat', name); 

    return false; 
}); 

// callback for when we know if user is already in chat or not 
socket.on('isUserInChat', function(exists, name) { 

    if(!exists) { 

     // this only fires once per form submission 
     console.log('username is available'); 

     // but this fires per user 
     socket.emit("join", name); 
    } else { 
     // username is taken 
     // display error message 
    } 
}); 

クライアントはsocket.emit("join", name);ラインは、最初の人が正しいフォームを送信する際に一度起動するように思えます。しかし、2人目がフォームを送信すると、joinイベントが2回発生します。第三者がフォームを提出すると、3回発砲します。ユーザーごとにイベントが発生するのはなぜですか?フォーム提出ごとに発射すればいいのですか?

サーバー

var express = require('express'), 
    app = express(), 
    http = require('http').Server(app), 
    io = require('socket.io')(http), 
    usersObj = { 
     users: [] 
    }; 

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

    socket.on('isUserInChat', function(username) { 

     var flag = false; 

     // for each user 
     for(var i = 0; i < usersObj.users.length; i++) { 

      // if username matches username that was entered 
      if(usersObj.users[i].username == username) { 

       // set flag to be true 
       flag = true; 
      } 
     } 

     // send client true or false 
     io.emit('isUserInChat', flag, username); 
    }); 

    socket.on('join', function(name) { 

     // construct user 
     var user = { 
      id: socket.id, 
      username: name 
     }; 

     // add user to users object array 
     usersObj.users.push(user); 

     // send chat message 
     io.emit('sendMsg', 'Chat Bot', name+' has connected to the server.'); 
    }); 
}); 

答えて

2

あなたが混乱しているようですが、あなたは実際にすべてのクライアントに発光するようにイベントを語りました。あなたはそれだけで戻って可用性を確認するのクライアントにエコーする場合

io.emit('isUserInChat', flag, username); 

は真である

socket.emit('isUserInChat', flag, username); 
+1

でなければなりません。 'io'でイベントを発行すると、サーバーに接続されているすべてのユーザーに対してイベントが発生します。 –

+1

大きなキャッチ。私はsocket.ioを初めて使っていて気付かなかった。私はその例を別の関数からコピーして、誰にもそのイベントを出しました。とにかく、スイッチを作ることはやりました。ありがとう! –

関連する問題