2015-10-13 79 views
0

我几乎完成了我的socket.io实现示例。 唯一缺少的是断开连接事件的功能。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> 

一切工作正常。 当用户上线时,cameOnline函数被激发并将用户添加到后端列表中。

虽然用户断开连接 - 没有任何反应。

任何想法? oO

回答

0

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

所以这样的事情应该工作:

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

(而且我会核实.emit太,我认为他们也有socket对象上调用,而不是在io

+0

感谢。当我在连接函数中使用.emit函数时,我遇到了一个问题,就是它们在pagerefresh上加倍了自己。emit函数似乎在io连接之外很好地工作,我在io连接中有断开连接的功能,但是它也没有工作。 –