2014-06-30 20 views
17

Sto utilizzando PassportJS con ExpressJS.Aggiornamento dei dati utente registrati nella sessione

Ho bisogno di aggiornare i dettagli utente registrati. Mentre aggiorno questo nel DB, come posso aggiornarlo anche nella sessione in modo che request.user contenga i dettagli aggiornati dell'utente?

Cioè, dopo aver aggiornato il database, come posso aggiornare le informazioni sulla sessione anche sull'utente?

Ho provato ad assegnare direttamente i dettagli aggiornati a request.user ma non ha funzionato. Ho quindi provato request.session.passport.user - questo ha funzionato, ma c'è un ritardo di circa 5-10 secondi prima che venga aggiornato anche in request.user.

Esiste una funzione che devo chiamare per aggiornare le informazioni dell'utente memorizzate nella sessione? O c'è qualche altro oggetto che posso aggiornare dove la modifica non ha un ritardo

risposta

26

Ho cercato anche una risposta per questo. Mai menzionato in nessun documento o tutorial!

Ciò che sembra funzionare è, dopo aver salvato il vostro utente appena aggiornato, fare 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) 
    }) 
}) 

L'indizio era qui ... https://github.com/jaredhanson/passport/issues/208

+0

Grazie per la precisazione. Questo sembra essere il modo corretto per aggiornare i dati della sessione poiché 'login' chiama la funzione serializzatore di passaporti che aggiorna i dati dell'utente memorizzati nella sessione. Tuttavia, per qualche ragione, ho riscontrato ritardi nell'aggiornamento della sessione, quindi il codice equivalente 'res.send (200)' nella mia applicazione è stato inserito all'interno di una funzione 'setTimeout' di 2 secondi - ciò ha aiutato. – callmekatootie

+0

Molto strano. Quindi se fai due registri di console come nel mio esempio, il secondo mostra ancora i vecchi dati? Si potrebbe pensare al momento in cui si verifica la richiamata req.login, ogni cambio asincrono sarebbe stato eseguito. Bene, se un secondo di attesa lo risolve ogni volta, sei bravo. – chichilatte

Problemi correlati