2015-11-24 6 views
0

Мне нужно реализовать функцию, которая, если количество зарегистрированных пользователей превышает допустимое количество пользователей, больше не должно быть разрешено войти в систему. Есть ли способ получить список запущенных/существующих сеансов? и как уничтожить конкретную сессию? Может ли кто-нибудь представить пример, поскольку я новичок в узле. Часть моего кода:Получить список существующих сеансов на connect-redis

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

Любая помощь приветствуется.

Большое спасибо заранее.

ответ

2

Вам нужно будет напрямую запросить коллекцию 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); 
}); 
+0

Это дает ошибку: TypeError: this.client.unref не является функцией на этой линии -> если (options.unref) это .client.unref(); в connect-redis.js – arsinawaz

+0

, где про это делает? – Alex

+0

, когда я перезапускаю свой узел, в этой строке https://github.com/tj/connect-redis/blob/master/lib/connect-redis.js#L89 – arsinawaz

0

Обычно я назначаю имя для каждого сеанса, например:

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