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

Jac*_*ack 27 redis node.js express

如果用户已经登录并尝试在新实例中再次登录,我希望它能够注销其他用户实例.我不希望同一个用户在我的应用程序上登录两次.

目前会话存储在Redis存储中,我使用express/connect来处理会话存储.可用于销毁会话的其中一个功能如下:

.destroy(sid, callback)
Run Code Online (Sandbox Code Playgroud)

但是我需要在调用.destroy()之前找到该会话ID.在Redis中,用户名存储为会话的一部分.

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

Joe*_*e H 73

req.sessionID 将为您提供会话的ID,其中req是请求对象.

  • 这不适合我.`req.sessionID`是`undefined`.NodeJS 9.x,快递4,快递会话1.15. (5认同)
  • 为什么这不是公认的答案?对我来说很棒.谢谢! (2认同)

sca*_*guy 20

对于最近的读者;

自版本4以来,Express中不包含Connect中间件.

因此,为了完成req.sessionID工作,您必须执行以下操作:

  1. 确保你的package.json中有cookie-parserabd express-session模块.如果没有添加,请添加它们:
npm install express-session --save
npm install cookie-parser --save
Run Code Online (Sandbox Code Playgroud)
  1. app.js文件中需要它们时要小心顺序并添加所需的配置参数.
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
}));
Run Code Online (Sandbox Code Playgroud)
  1. 现在你应该使用req.sessionIDreq.session.id.

  • cookie-parser在快速会话中被弃用于1.5.0(请参阅https://github.com/expressjs/session上的自述文件).实际上,cookie-parser现在可以引起副作用. (3认同)

Jac*_*ack 16

当用户在数据库验证用户帐户调用.destroy(sid,fn)期间登录时,将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}});
       ...
    }
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)