gpt4 book ai didi

javascript - Socket.io 断开连接功能不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:47 25 4
gpt4 key购买 nike

我的 socket.io 实现示例即将完成。唯一缺少的是断开连接事件的功能。

我试过把它放在io连接函数里面,外面,一切都浮现在我的脑海里。遗憾的是,断开连接功能根本没有被触发。

这是我的路由文件代码,其中包含上述功能:

/* GET /backend */
router.get('/', function(req, res, next) {
if (req.session && req.session.user) { // Check if session exists

var currentUser = req.session.user[0].name; // save username according to session

if(!req.session.user[0].io){
req.app.get('io').on('connection', function(socket){ // Gets executed when user connects to /backend/
req.session.user[0].io = true; // Sets the io session to true
console.log("IO SESSION SET : "+ req.session.user[0].io +" for user " + currentUser);
});

if(req.session.user[0].io){
req.app.get('io').on('disconnect', function(){
req.session.user[0].io = false;
console.log("IO SESSION SET : "+ req.session.user[0].io +" for user " + currentUser);
req.app.get('io').emit('wentOffline', currentUser); // emit wentOffline to client js
});
}
req.app.get('io').emit('cameOnline', currentUser); // emit function cameOnline to client js
}
// res.render('backend', { title: 'Backend' });
// console.log(req.session.user[0].name);

/*
-------------------------
#########################
IF EVERYTHING FAILS - THE CODE BELOW IS THE NORMAL RENDER WITHOUT SOCKET IO
#########################
-------------------------
*/
// lookup the user in the DB by pulling their email from the session
User.getUser({ name: req.session.user.name }, function (err, user) {
if (!user) {
console.log("No User found");
// if the user isn't found in the DB, reset the session info and
// redirect the user to the login page
// console.log(user);
req.session.reset();
res.redirect('/login');
} else {
// expose the user to the template
res.locals.user = user;
// render the dashboard page


function passOnlineUsers(callback){ // Looks for All users who are online
User.getOnlineUsers({}, function(err, res, fields){
// console.log(res);
if (err) throw err;
callback(err, res);
});
}

passOnlineUsers(function(err, result){
res.render('backend', { title: 'Backend', viewer: req.session.user[0], online: result });
// res.render('backend', { title: 'Backend', viewer: "", online: result });
});
}
});
} else {
res.redirect('/login');
}
});

如果这里还需要加载带有 io 代码的客户端文件:

<script>
var socket = io();
// socket.emit('cameOnline', "new User");

socket.on('cameOnline', function(name){
console.log(name + " connected.");
var $li = $('<li/>');
$li.addClass(name);
if($('#onlineUsers .'+name).length == 0){
console.log(name + " is about to be added");
$li.text(" "+ name);
$('#onlineUsers').append($li);
}else{
console.log("no new user");
}
// $('#onlineUsers').append($("<span>").text(" " + name)).addClass(name);
});

socket.on('wentOffline', function(name){
console.log(name +" is about to go offline");
var toDel = $('#onlineUsers li.'+name);
toDel.remove();
});
</script>

除了断开连接功能之外,一切正常。当用户上线时,camOnline 函数将被触发并将用户添加到后端的列表中。

尽管当用户断开连接时 - 什么也没有发生。

有什么想法吗? oO

最佳答案

disconnect 事件处理程序应附加到 socket,而不是主 io 对象。

所以像这样的东西应该有效:

req.app.get('io').on('connection', function(socket){
...
socket.on('disconnect', function(){
...
});
});

(我也会验证 .emit 。我认为它们也必须在 socket 对象上调用,而不是在 io 上调用。

关于javascript - Socket.io 断开连接功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com