0

我正在尝试编写一个带有会话和用户身份验证的简单 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);

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

4

2 回答 2

4

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

但是,默认的Connect 内存会话存储不应该在生产中使用)提供了一个 .all 函数,它允许您获取所有会话。

sessionStore.all(function(err, sessions) {
    // if err handle err
    // iterate over sessions array
});
于 2013-08-13T06:54:53.677 回答
1

如果您使用Redis支持 express 的流行会话,这是在此处实现的,因此您只需调用该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);
            })
//...
于 2017-09-20T12:45:29.303 回答