Socket.io和Express> v4 - 连接奇怪地堆叠

时间:2015-10-12 15:55:30

标签: javascript node.js sockets express socket.io

经过一番挣扎之后,我设法用快递版>运行socket.io。 v4现在我经历了一些我无法弄清楚的奇怪行为。

首先让我解释一下我的例子。

我已经构建了一个用户可以登录的测试后端。 登录后,用户只能看到当前在线用户的列表。 我如何获得当前的在线用户?

好。对于此示例,登录到后端部分的每个用户都是“在线”,因此应该显示在该列表中。

现在代码。

带有io功能的后端路由器发出:

router.get('/', function(req, res, next) {
  // console.log("socket io req response: ",req.app.get('io') );
  if(!req.session.user[0].io){
    req.app.get('io').on('connection', function(socket){ // Gets executed when user connects to /backend/
      var currentUser = req.session.user[0].name; // save username according to session
      req.session.user[0].io = true;
      console.log("IO SESSION SET : "+ req.session.user[0].io +" for user " + currentUser);
      // console.log('User connected : ' + currentUser); // Log user to server


      req.app.get('io').emit('cameOnline', currentUser); // emit function cameOnline to client js

      socket.on('disconnect', function(){
        // console.log('User: '+req.session.user[0].name+' disconnected.'); // Log disconnected user to server
        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
      });
    });
  }
  // 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
  #########################
  -------------------------
  */

  if (req.session && req.session.user) { // Check if session exists
    // 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');
  }
});

在建立socket.io连接之前,我检查用户会话是否已经说过他有一个。如果不是 - >然后继续创建连接。

然后函数“cameOnline”被发送到客户端,如下所示:req.app.get('io').emit('cameOnline', currentUser);

现在到客户端代码:

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();
});

客户端侦听“cameOnline”发出并添加用户(如果他不在列表中)。

与断开功能类似的行为。非常自我解释。

现在问题:

当我使用用户登录后端时:“Noa”我看到列表中的用户“Noa”已正确显示。

现在当我打开一个单独的浏览器并与另一个用户登录时:“Albert”用户正确地将其添加到两个客户端的在线列表中。

完美。

BUT

当我与用户断开连接时:“Albert”用户“Noa”的在线用户列表被完全清除,就像没有人在线一样。

当我以“Noa”用户刷新页面时,我突然看到两个用户再次在线,尽管第二个用户不再在线。

当我检查客户端上的控制台时,我看到console.log(name + " is about to be added");的重复日志,好像有某种缓存一样。我刷新的用户“副本”越多。 我在线的用户的“副本”会增加,并且WAS在线用户的一个奇怪副本也会保留在那里。一直以来。

我在做什么大概错了?

**编辑**

bin / www io声明:

/**
* Socket IO
*/
var io = require('socket.io')(server);
app.set('io',io);

0 个答案:

没有答案