Удалить предыдущие сеансы при входе с нового устройства MEANJS

Я хочу удалить предыдущий сеанс из MongoStore / sessionStore, если пользователь входит в систему с нового устройства. MEANJS использует

экспресс-сеанс подключения-монго

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

MongoStore = require('connect-mongo')(session),
favicon = require('serve-favicon'),

    module.exports.initSession = function (app, db) {
  // Express MongoDB session storage
  app.use(session({
    saveUninitialized: true,
    resave: true,
    secret: config.sessionSecret,
    cookie: {
      maxAge: config.sessionCookie.maxAge,
      httpOnly: config.sessionCookie.httpOnly,
      secure: config.sessionCookie.secure && config.secure.ssl
    },
    key: config.sessionKey,
    store: new MongoStore({
      mongooseConnection: db.connection,
      collection: config.sessionCollection
    })
  }));
};

person Zaid Iqbal    schedule 21.11.2016    source источник
comment
Что ж, если вы удалите общий сеанс, тогда люди должны будут повторно входить в систему каждый раз, когда они меняют устройство, при общем сеансе они остаются в системе одновременно из браузера и телефона.   -  person Medet Tleukabiluly    schedule 22.11.2016
comment
@MedetTleukabiluly, хорошо, вы можете показать мне какой-нибудь код в качестве руководства и где мне нужно удалить общий код сеанса?   -  person Zaid Iqbal    schedule 22.11.2016


Ответы (2)


Это должно сработать, по крайней мере, для вас это хорошая отправная точка.

var async = require('async'); //npm install async --save
exports.removeSessionsForUser = function(req, res, next) {
    var userId = req.user ? req.user.id : undefined;
    if (!userId)
        return next(new Error('No user found in req. Exiting'));

    var store = req.sessionStore;
    var sessionsColl = store.db.collection('sessions');

    sessionsColl.find({
        'session.user': userId,
        // we are tryin to remove all sessions, you can leave current
        // '_id': { '$ne': req.sessionID }
    }, { _id : 1 }, function (err, userSessions) {
        async.each(userSessions, function (userSession, cb) {
            store.destroy(userSession._id, cb);
        }, function(notDone) {
            if(notDone)
                return next(new Error(notDone));

            res.send('ok');
        });
    });
}

Здесь используется async.each, который

async.each(Array, function(item, callback) {/* iterate */}, function(error) {/* end */});
person Medet Tleukabiluly    schedule 22.11.2016
comment
Спасибо за помощь, позвольте мне проверить это решение и вернуться к вам. Спасибо еще раз - person Zaid Iqbal; 22.11.2016
comment
Примечание @ZaidIqbal: люди должны повторно входить в систему каждый раз, когда они меняют устройство - person Medet Tleukabiluly; 22.11.2016
comment
userSession._id, _id не определен, появляется ошибка в этой строке - person Zaid Iqbal; 22.11.2016
comment
Да, это то, что мне нужно, чтобы людям приходилось снова входить в систему каждый раз, когда они меняют устройство. - person Zaid Iqbal; 22.11.2016
comment
зарегистрируйте его, посмотрите, какие поля у него есть, возможно, userSessions - это строковый идентификатор, например ['id1', 'id2'] - person Medet Tleukabiluly; 22.11.2016
comment
postimg.org/image/hzljfjpfp, вы можете проверить это изображение объекта здесь - person Zaid Iqbal; 22.11.2016
comment
пожалуйста, проверьте размещенное изображение и помогите в том, как мы можем выполнить итерацию и удалить конкретную сессию из этого объекта - person Zaid Iqbal; 22.11.2016
comment
проверьте поле s, наверное, дело в - person Medet Tleukabiluly; 22.11.2016
comment
Давайте продолжим это обсуждение в чате. - person Zaid Iqbal; 22.11.2016

Наконец, с помощью я смогу решить проблему Вот мой код

    exports.logoutFromPreviousDevices = function (req, res) {
  var userId = req.query.userid;
  if (!userId)
    return res.status(400).send({
      message: errorHandler.getErrorMessage('No user found in input request')
    });

  var store = req.sessionStore;
  var sessionsColl = store.db.collection('sessions');

  sessionsColl.find({
    // 'session.passport.user': userId,
    // we are tryin to remove all sessions, you can leave current
    // '_id': { '$ne': req.sessionID }
  }, function (err, userSessions) {
    if (userSessions !== null) {
      userSessions.toArray(function (a, sessionsData) {
        sessionsData.forEach(function (element, index) {
          var data = JSON.parse(element.session);
          if (element._id !== req.sessionID && req.query.userid === data.passport.user) {
            store.destroy(element._id, function (destroyerr, dat) {
              if (destroyerr)
                return res.status(400).send({
                  message: errorHandler.getErrorMessage(destroyerr)
                });
              res.jsonp({ status: 'Previous session deleted' });
            });
          }
        });
      });
    } else {
      res.jsonp({ status: 'No session found' });
    }
  });
};
person Zaid Iqbal    schedule 22.11.2016