帆+检查会话

时间:2014-12-17 08:11:50

标签: node.js sockets cron sails.js

我正在使用SailsJS和Socket.IO 目前我需要知道用户的会话是否已过期 一旦用户的会话过期,我需要断开该用户的套接字连接。

一种方法是每隔30分钟使用CRON并检查用户是否仍然登录。

有没有办法在不使用CRON的情况下检查用户的会话是否仍然存在。

先谢谢

2 个答案:

答案 0 :(得分:2)

幸运的是,Node是Javascript,Javascript使这种事情变得非常简单。您可以像常规ol'前端脚本一样使用setInterval。因此,假设您的User模型具有expiresOn字段,您可以检查config/bootstrap.js中的以下内容:

module.exports = function(cb) {

  // Schedule disconnectExpiredUsers to run once a minute
  setInterval(disconnectExpiredUsers, 60000);

  // Function to loop through all expired users and disconnect them
  function disconnectExpiredUsers() {

    var now = new Date();
    User.find({expiresOn: {'<': now}}).exec(function(err, expiredUsers) {

      // Handle errors somehow
      if (err) {
        return console.log(err); 
      }

      // Loop through expired users (lodash is globalized by Sails)
      _.each(expiredUsers, function(expiredUser) {

        // Since you're using resourceful pubsub (right???),
        // we can get all of the instance's sockets easily
        var sockets = User.subscribers(expiredUser);

        // And we can send them a message
        User.publishMessage(expiredUser, "Session expired, buddy!");

        // And disconnect them, but use nextTick to make sure the messages
        // go out first
        process.nextTick(function() {
          _.each(sockets, function(socket) {socket.disconnect();});
        });


      });


    });

  }

};

这也假设您使用Sails'resourceful pubsub订阅套接字到User个实例;否则你必须自己跟踪连接套接字的ID。

答案 1 :(得分:0)

您可以通过向所有路线添加政策

来实现此目的

只需将sessionAuth.js添加到策略文件夹

即可
module.exports = function(req, res, next) {


  // If you are not using passport then set your own logic
  /*if (req.session.authenticated) {
    return next();
  }*/

  // if you are using passport then
  if(req.isAuthenticated()) {
    return next();
  }

  //else

  // Write your code for socket disconnect

  // or send json res like this

  return res.json({msg:'You are not loggedin, Please Login !'})


};

现在转到config / policies.js

并将此政策应用于所有路线

module.exports.policies = {

    '*': 'sessionAuth'
}