Как я могу найти идентификатор сеанса при использовании Express / Connect и хранилища сеансов?

Если пользователь уже зарегистрировался и снова пытается войти в новый экземпляр, я бы хотел, чтобы он выходил из другого экземпляра пользователя. Я не хочу, чтобы один и тот же пользователь дважды регистрировался в моем приложении.

В настоящее время сеанс хранится в магазине Redis, я использую express / connect для обработки хранилища сеансов. Одна из доступных функций, которая может быть использована для уничтожения сеанса, выглядит следующим образом:

.destroy(sid, callback) 

Однако мне нужно найти этот идентификатор сеанса, прежде чем я вызову .destroy (). В Redis имя пользователя хранится как часть сеанса.

Вопрос: Можно ли запросить Redis для получения идентификатора сеанса на основе имени пользователя?

req.sessionID предоставит вам SID сеанса.

Храните SID с учетной записью, когда пользователь регистрируется во время проверки базы данных учетной записи пользователя .destroy (sid, fn), а затем обновляет 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}}); ... } ... } } 

Для недавних читателей;

Соединительные посредники не включены в Express с версии 4.

Поэтому, чтобы иметь работу req.sessionID вы должны сделать следующее:

  1. Убедитесь, что в вашем пакете package.json есть модули abd express-session cookie-parser . Если он не добавлен, добавьте их:
 npm install express-session --save npm install cookie-parser --save 
  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 })); 
  1. Теперь вы должны использовать req.sessionID и req.session.id .

Вопрос: Можно ли запросить Redis для получения идентификатора сеанса на основе имени пользователя?

Нет. Клавиши сеанса в redis не называются после имени пользователя.

Вот мысль: если уже зарегистрированный пользователь снова пытается войти в систему, вы не можете увидеть это в своем приложении и немедленно уничтожить старый сеанс или не разрешить им снова войти в систему?