我正在尝试与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:
在第二个选项卡上,当到达服务器端时,我看到请求套接字正在为每个事件订阅TWICE。 我不知道为什么。
更新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'文件,它运行正常。
我仍然无法弄清楚为什么这些事件不止一次被召唤。