如何枚举nodejs + express中的所有会话?

时间:2013-08-13 03:59:57

标签: node.js express

我正在尝试使用会话和用户身份验证编写一个简单的nodejs服务器。 这是代码:

var express = require('express'),
    app = express(),
    fs = require('fs'),
    passport = require('passport'),
    jade = require('jade'),
    BasicAuthStrategy = require('passport-http').BasicStrategy,
    webRootDir = __dirname + '/web',
    templatesDir = __dirname + '/templates/';

passport.use(new BasicAuthStrategy(
    function (username, password, cb) {
        "use strict";
        cb(null, username);
    }
));

app.use(express.logger());
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({secret: 'd6151b7e-8997-4187-a95e-29ce08450094'}));
app.use(passport.initialize());
app.use(passport.authenticate('basic', { session: false }));
app.use(express.favicon());
app.use(app.router);
app.use(express['static'](webRootDir));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.set('view engine', 'jade');
app.engine("jade", jade.__express);

app.get('/', function (req, res) {
    "use strict";
    res.render(templatesDir + 'index', {
        user: req.user
    });
});

app.listen(8080);

现在我想枚举自服务器启动以来创建的所有会话(我不是在寻求会话持久性)并检查它们的内容。我该怎么做?

2 个答案:

答案 0 :(得分:3)

这取决于您正在使用的会话存储。会话存储不需要提供获取所有存储会话的机制。

但是,默认Connect in-memory session storewhich you should not use in production)提供了.all功能,可以让您获得所有会话。

sessionStore.all(function(err, sessions) {
    // if err handle err
    // iterate over sessions array
});

答案 1 :(得分:1)

如果您使用支持Express的热门Redis会话,则会实现here,因此您只需调用redisStore.all方法,这样您就可以做出承诺

WebApp.prototype.allSessions = function() {
        var self=this;
        return new Promise((resolve, reject) => {
            self.store.all((error, results) => {
                if( error ) return reject(err);
                else return resolve(results);    
            });
        });
    }//allSessions

会话由Redis支持

self.store=new RedisStore(redisConfig); // session store
// express session options
var sessionOptions={
    store: self.store,
    secret: oauthConfig.secret,
    cookie: {
        /** when the session gonna expire */ 
        expire: new Date( Date.now() + self._options.session.expiresInMsec ),
        /** how long the session lasts [ms]*/
        maxAge: self._options.session.expiresInMsec
    },
    resave: false, // avoid race conditions
    saveUninitialized: false // avoid race conditions
}

您可以在每次登录时枚举实时会话,如:

var oAuthStrategy = new OAuth2Strategy(oAuthOptions, function(accessToken, refreshToken, profile, done) {

            self.allSessions()
            .then(results => {
                console.log(results);
            })
//...