Обновить данные зарегистрированного пользователя в сеансе

Я использую PassportJS с ExpressJS.

Мне нужно обновить данные зарегистрированного пользователя. Пока я обновляю это в БД, как мне обновить его и в сеансе, чтобы request.user содержал обновленные данные пользователя?

То есть, после обновления базы данных, как мне также обновить информацию о сеансе пользователя?

Я попытался напрямую назначить обновленные данные request.user, но это не сработало. Затем я попробовал request.session.passport.user - это сработало, но есть задержка от 5 до 10 секунд, прежде чем он также будет обновлен в request.user.

Есть ли функция, которую мне нужно вызвать, которая обновляет информацию о пользователе, хранящуюся в сеансе? Или есть какой-то другой объект, который я могу обновить, где изменение не имеет задержки


person callmekatootie    schedule 30.06.2014    source источник


Ответы (3)


Я тоже искал ответ на это. Никогда не упоминается ни в каких документах или учебниках!

Кажется, что работает, после сохранения вашего нового обновленного пользователя выполните req.login(user)...

// "user" is the user with newly updated info
user.save(function(err) {
    if (err) return next(err)
    // What's happening in passport's session? Check a specific field...
    console.log("Before relogin: "+req.session.passport.user.changedField)

    req.login(user, function(err) {
        if (err) return next(err)

        console.log("After relogin: "+req.session.passport.user.changedField)
        res.send(200)
    })
})

Подсказка была здесь... https://github.com/jaredhanson/passport/issues/208

person chichilatte    schedule 30.06.2014
comment
Спасибо, что указали на это. Кажется, это правильный способ обновления данных сеанса, поскольку login вызывает функцию сериализатора паспорта, которая обновляет данные пользователя, хранящиеся в сеансе. Однако по какой-то причине у меня возникли задержки при обновлении сеанса, поэтому эквивалентный код res.send(200) в моем приложении был помещен внутри функции setTimeout на 2 секунды - это помогло. - person callmekatootie; 01.07.2014
comment
Очень странно. То есть, если вы сделаете два лога консоли, как в моем примере, то второй по-прежнему будет показывать старые данные? Можно подумать, что к тому времени, когда произойдет обратный вызов req.login, все асинхронные изменения будут выполнены. Что ж, если 2-секундное ожидание исправляет это каждый раз, все в порядке. - person chichilatte; 01.07.2014

User.findById(req.user._id,function(err,doc){
        req.logIn(doc,function(err1){

                if(err1){ console.log("Error : "+err1) }
                              else{
                                    res.render("abc.ejs",{user:req.user});
                                    console.log('Item Removed Successfully!!!');
                              }

                        });
                  });

Здесь мы повторно логиним пользователя
User => Mongoose Model

person saurabh kumbhar    schedule 02.06.2020

У меня была аналогичная проблема сегодня, и я решил поделиться своими выводами, так как я не мог найти аналогичный ответ.

Проблема заключалась в том, что (скопировано из паспортной документации) я получал данные пользователя непосредственно из токена, который пользователь отправил в запросе. Что, конечно, устарело.

passport.use(new JWTStrategy({
    jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
    secretOrKey   : CONFIG.JWT_SECRET
  },
  function (jwtPayload, cb) {
    return cb(null, jwtPayload);
  }
));

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

return User.findById(jwtPayload.id)
  .then(user => {
    return cb(null, user);
  })
  .catch(err => {
    return cb(err);
  });
person Arntor    schedule 06.11.2020