【问题标题】:Get list of existing sessions on connect-redis获取 connect-redis 上现有会话的列表
【发布时间】:2015-11-24 09:44:01
【问题描述】:

我必须实现一个功能,如果登录用户数超过允许的用户数,则不应允许更多用户登录。有没有办法获取正在运行/现有会话的列表?以及如何销毁特定会话?任何人都可以提供一个例子,因为我是 node.js 的新手。我的部分代码是:

express = require('express'),
session = require('express-session'),
RedisStore = require('connect-redis')(session),
bodyParser = require('body-parser');

redisOpts = {
    pass: config.REDIS_PASS,
    host: config.REDIS_SERVER || null,
    port: config.REDIS_PORT || null
},

sessionStore = new RedisStore(redisOpts),

app = express();

app.use(session({
   store: sessionStore,
   secret: 'XXX',
   resave: true,
   saveUninitialized: true
}));

编辑

express = require('express'),
session = require('express-session'),
redis   = require("redis"),
RedisStore = require('connect-redis')(session),
bodyParser = require('body-parser');

redisOpts = {
    pass: config.REDIS_PASS,
    host: config.REDIS_SERVER || null,
    port: config.REDIS_PORT || null
},

redisClient = redis.createClient(redisOpts.port, redisOpts.host, { auth_pass: redisOpts.pass }),
sessionStore = new RedisStore(redisClient),
app = express();

app.use(session({
   store: sessionStore,
   secret: 'XXX',
   resave: true,
   saveUninitialized: true
}));

如果检查会话列表,则在登录功能内的 app.js 中:

redisClient.keys("sess:*", function(error, keys){
        console.log("Number of active sessions: ", keys.length);
        console.log(keys);
});

在此编辑之后,它在此行的 connect-redis.js 中引发错误:

 TypeError: this.client.unref is not a function
 if (options.unref) this.client.unref();

感谢任何帮助。

非常感谢。

【问题讨论】:

    标签: node.js session express node-redis


    【解决方案1】:

    不过,您需要直接查询 redis 集合。

    由于 connect-redis 在内部使用 redis.createClient(),因此您可以传入 redis 客户端的实例而不是凭据。比如:

    //I've kept your redisOpts for clarity
    redisOpts = {
        pass: config.REDIS_PASS,
        host: config.REDIS_SERVER || null,
        port: config.REDIS_PORT || null
    },
    
    var redisClient = redis.createClient(redisOpts.port, redisOpts.host, { auth_pass: redisOpts.pass });
    

    现在,像以前一样配置你的 redis 存储,但传入 redisClient

    sessionStore = new RedisStore(redisClient)
    

    您现在可以使用相同的redisClient 来查询会话密钥的数量

    redisClient.keys("sess:*", function(error, keys){
        console.log("Number of active sessions: ", keys.length);
    });
    

    【讨论】:

    • 这是一个错误:TypeError: this.client.unref is not a function on this line -> if (options.unref) this.client.unref();在connect-redis.js中
    • 这会扔到哪里去?
    • 当我重启我的节点时,在这条线上github.com/tj/connect-redis/blob/master/lib/…
    • 嗯,这很奇怪,这是库抛出错误.....您可以编辑您的问题以显示您的新代码,将 redisClient 传递给RedisStore
    • hmm,你安装的是什么版本的redis客户端?你是通过 npm 安装的吗?
    【解决方案2】:

    我通常为每个会话设置一个名称,例如:

    var redis_client = redis.createClient();
    redis_client.client('setname', 'tour-client');
    

    然后当我想检查它时:

    redis_client.multi().client(['list']).exec(function(err, results) {
      var pairs = results[0].split(' ');
      pairs.forEach(function(pair){
        var kv = pair.split('=');
        if (kv[0] == 'name' && kv[1] == 'some-name-looking-for')
          found = true;
      });
      if (found) {
        // some logic
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 2020-05-31
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2011-07-22
      • 2013-07-10
      相关资源
      最近更新 更多