我正在尝试使用 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);
}
}
当我登录第一个浏览器选项卡(对于第一个用户)时,一切正常,但是当我登录第二个浏览器选项卡(对于第二个用户)时,由于某种未知原因,服务器端的“加入”事件被调用超过一次!
我在 API 上读到“socket.emit”假设只为当前请求套接字客户端引发事件,那么问题可能是什么?
更新:
我在第一次和第二次调用时查看了 socket.id,它是一样的。为什么会这样?
更新 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”文件,它工作正常。
我仍然无法弄清楚为什么这些事件被多次调用。