如何在使用express / connect和会话存储时查找会话ID?

如果用户已经login并尝试在新实例中重新login,我希望它注销另一个用户实例。 我不希望同一个用户在我的应用程序上login两次。

目前会话存储在Redis存储中,我使用快速/连接来处理会话存储。 可用于破坏会话的function之一如下:

.destroy(sid, callback) 

但是,我需要find该会话ID,然后再调用.destroy()。 在Redis中,用户名被存储为会话的一部分。

问题:是否可以通过查询Redis来获取基于用户名的会话ID?

req.sessionID将为您提供会话的SID。

在用户帐户调用.destroy(sid,fn)的数据库validation过程中,当用户login时,使用该帐户存储SID,然后使用用户的当前SID更新数据库中的SID。

在我使用MongoDB的情况下,我是这么做的:

 app.post('/login', function(req, res) { var sid = req.sessionID; var username = req.body.user; var password = req.body.pass; users.findOne({username : username, password : password}, function(err, result) { ... sessionStore.destroy(result.session, function(){ ... users.update({_id: result._id}, {$set:{"session" : sid}}); ... } ... } } 

对于最近的读者;

自从版本4以来,连接中间件不包括在Express中。

所以为了让req.sessionID工作,你必须做到以下几点:

  1. 确保你的package.json里有cookie-parser abd express-session模块。 如果没有添加,请添加它们:
 npm install express-session --save npm install cookie-parser --save 
  1. app.js文件中要求它们的顺序时要小心,并添加所需的configuration参数。
 var cookieParser = require('cookie-parser'); var session = require('express-session') app.use(cookieParser()); app.use(session({ secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string resave: false, saveUninitialized: true })); 
  1. 现在你应该使用req.sessionIDreq.session.id

问题:是否可以通过查询Redis来获取基于用户名的会话ID?

不会。在redis中的会话密钥不是以用户名命名的。

这里有一个想法,但是:当一个已经login的用户试图再次login,你不能看到,在你的应用程序,并立即销毁旧的会议,或不让他们再次login?