获取 connect-redis 上的现有会话列表

Get list of existing sessions on connect-redis

我必须实现一项功能,如果登录用户数超过允许的用户数,则不应允许更多用户登录。有没有办法获取 running/existing 会话的列表?以及如何销毁特定会话?谁能提供一个例子,因为我是 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();

感谢任何帮助。

非常感谢。

不过您需要直接查询 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);
});

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

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