私は socket.io で非常に単純なチャットを実装しようとしていますが、本当に奇妙な問題に直面しています。
サーバ側:
var users = {};
io.sockets.on('connection', function (socket) {
socket.on('join', function(userNameParam) {
socket.join('chatchannel');
users[userNameParam] = userNameParam;
socket.userName = userNameParam;
socket.emit('firstLogin',users);
socket.broadcast.to('chatchannel').emit('addConnectedUser',userNameParam);
});
});
クライアント側:
var socket = io.connect();
function onLogInLogOutClick() {
var userName = document.getElementById("txtUserName").value;
// get button text
var btnLogInLogOut = document.getElementById('btnLogInLogOut');
var txtBtnLogInLogOut = btnLogInLogOut.textContent || btnLogInLogOut.innerText;
if(txtBtnLogInLogOut == 'LogIn')
{
// send join message
socket.emit('join', userName);
}
}
最初のブラウザー タブ (最初のユーザーの場合) でログインすると、すべて正常に動作しますが、2 番目のブラウザー タブ (2 番目のユーザーの場合) でログインすると、サーバー側の「参加」イベントが何らかの理由で呼び出されます。一度!
「socket.emit」が現在のリクエストソケットクライアントに対してのみイベントを発生させると想定しているAPIを読んだので、何が問題になるのでしょうか?
アップデート:
最初と 2 番目の呼び出しで socket.id を確認しましたが、同じです。なぜそれが起こるのですか?
更新 2:
2 番目のタブで、サーバー側に到達すると、リクエスト ソケットが各イベントに 2 回サブスクライブしていることがわかります。どうしてか分かりません。
更新 3:
問題が見つかりました: サーバーコードは次の場所に配置されました:
module.exports = function(app, socketio, loggerInstance) {
io = socketio;
app.get('/chat',chat);
};
var chat = function(req, res){
*** SERVER CODE THAT WAS WRITTEN ABOVE ***
res.render('chat');
};
サーバー コードを「app.js」ファイルに移動したところ、正常に動作しました。
それでも、これらのイベントが複数回呼び出された理由がわかりません。