Wie update req.Benutzer-session-Objekt festlegen, indem passportjs?
Ich versuche, dies zu tun, da eine Menge Tage, aber alle meine versuche fehl...
Nutzer auf meiner Plattform verbinden Sie mit passportjs Strategien (paypal, facebook, google...).
Wenn der Benutzer angeschlossen ist, Schreibe ich seinen nickname auf der rechten Seite in der Kopfzeile.
Der html-code der html-header wird generiert aus einer LENKER-Vorlage, und wenn diese teilweise serviert von expressjs, sende ich die erf.Benutzer-session-Objekt auf die Vorlage, um zu schreiben, Spitznamen und weitere Informationen...
Durch die Art und Weise, dies funktioniert Super, aber ich habe ein problem, wenn der Benutzer aktualisieren, seinem Spitznamen aus seinem Profil, ich kann nicht update-session-Objekt auf der server-Seite, und wenn der Benutzer die Seite neu laden, die alten nickname wieder erscheint.
Und will ich nicht anfordern, Informationen zum Benutzer aus der DB jedes mal, wenn ein Benutzer eine Seite zu laden, so will ich halten diese config :
//-- Passport session setup
passport.serializeUser(function(user, done) { done(null, user); });
passport.deserializeUser(function(obj, done) { done(null, obj); });
Mein middleware zu setzen einheimischen :
//-- Set accessible datas from the template
res.locals = _.extend(res.locals, {
user: req.user,
query: req.url,
title: app.config.title,
url: app.config.url
});
Mein fehl :
//Trying to update req.user directly : not persistent
req.user.nickname = User.get('nickname');
//Trying to update passport session : exception error
req.session.passport.user = User.toJSON();
//Trying to replace full session object : not persistent
var session = req.session;
session.passport.user = User.toJSON();
req.session = session;
Jede Anregung ?
Für moment, nur ein ausloggen, dann einloggen funktioniert... Es ist nicht wirklich effizient 🙂
BEARBEITEN :
//Application router
var Router = require('./helpers/router.js');
//Create Express Server
var app = express().http().io();
//-- Init app router
var router = new Router(app);
//-- Framework Middleware
app.use(router.middleware);
#########################
/***
* APP ROUTER
**/
//Export router
module.exports = function(app) {
//Set instance
var router = this;
//Returns routes register & middleware methods
return {
//-- Register routes
register: function() {
requirejs(['routes'], function(routes) {
_.each(routes, function(name, route) {
app.get(route, function(req, res, next) {
requirejs(['views/'+name], function(view) {
if ( view ) {
var _view = new view(_.extend(req.params, {server: {req: req, res: res, next: next}}));
_view.render(name, req, res, next);
}
else {
next();
}
}, function (err) {
console.log('error' + err)
});
});
});
});
},
//-- Bind middleware
middleware: function(req, res, next) {
//Get the current path
console.log("Middleware :: "+req.url);
//Add user informations
res.locals = _.extend(res.locals, {
user: req.user,
query: req.url,
title: app.config.title,
url: app.config.url
});
//Go next
next();
}
}
}
Die middleware genannt, nur nach statischen Routen, setzen Sie die einheimischen für die Ansicht, und fahren Sie mit den vorgegebenen Routen. Ich habe bearbeitet den post, um zu zeigen, mehr code !
mögliche Duplikate von Update angemeldet Nutzerdaten in session
InformationsquelleAutor G33k Labs | 2013-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das funktioniert und bleibt für mich:
Sind Sie beschäftigt-caching auf Ihre Routen, die Sie eventuell benötigen Zerschlagung, bevor Sie aktualisieren?
(Pass serialisieren ist die gleiche)
InformationsquelleAutor Will Stern
Für 'serializeUser' sind Sie wieder, die ganzen user... die serialize-das gesamte Objekt und legte es in das cookie verwendet, um Sitzungen nachzuverfolgen. Dass die Serialisierung geschieht nur ein mal (wenn die Sitzung eingerichtet ist). Bei der nächsten Anfrage kommt, ist es immer deserialisiert, dass genau die gleiche Benutzer-Objekt, das Sie ursprünglich gespeichert, die keine updates Sie. Das ist, warum Sie sich Abmelden und wieder anmelden funktioniert, denn es ruft die bearbeiteten Benutzer aus der Datenbank (nehme ich an), und stellt das session tracking cookie.
Bestätigen diese Antwort, setzen Sie einen breakpoint auf 'serializeUser', und bemerken, dass es nur Treffer, wenn Sie sich einloggen.
InformationsquelleAutor markdb314
Ich hab das gleiche problem und endlich habe ich die Lösung gefunden:
Den erf.login-Aufruf serialize-Funktion und speichern Sie eine neue Sitzung in db.
res.end() ist wichtig. ohne Sie ist die Sitzung nicht gespeichert werden.
InformationsquelleAutor Quan Duong
Dies ist immer noch einer der top-Ergebnisse für 'update-Sitzung Pass js', so dass ich dachte, ich würde hinzufügen, was für mich gearbeitet (sofern die Antworten nicht für mich arbeiten):
Ohne
req.session.save()
die session-Daten nicht aktualisieren, für mich.Hoffe, das jemand hilft.
InformationsquelleAutor Reynaerde