Node.js & Express-session-problem
Ich habe ein problem mit sessions, wo manchmal die session-variable, die ich nur set
undefiniert ist auf der nächsten Seite anfordern. Ich in der Regel gehen durch die Strömung
wieder, um richtig legen Sie die Variablen.
Kann ich bestätigen, dass ich nicht versuchen, die session-Variablen auf "undefined"; Sie haben einen echt Wert.
In meiner app, Nutzer, aus - /twitter - /schließen//twitter/callback/. Der ehemalige retreives einige oauth-Daten von twitter, die letztere meldet sich der Benutzer in twitter.
/twitter/connect/ist einfach:
app.get('/twitter/connect/?', function(req, res){
consumer().getOAuthRequestToken(function(error, oauthToken, oauthTokenSecret, results){
if (error){
//error handling here
} else {
req.session.oauthRequestToken = oauthToken;
req.session.oauthRequestTokenSecret = oauthTokenSecret;
//if I console.log the two session variables above
//they have the proper values.
res.redirect("https://twitter.com/oauth/authorize?oauth_token="+req.session.oauthRequestToken);
}
});
});
Danach, twitter sendet Sie zurück an /twitter/callback/:
app.get('/twitter/callback/?', function(req, res){
console.log(req.session.oauthRequestToken);
console.log(req.session.oauthRequestTokenSecret);
//more often than not, the two variables above are
//undefined. but not always. usually on the first
//pass, never on the second.
});
Ich habe keine Ahnung, was Los ist, kann ich bestätigen, dass die session-Variablen sind richtig eingestellt ist, kann Sie nur nicht halten Ihren Wert zwischen Seite Anfragen, aber nur die erste Zeit.
Dies ist, wie ich bin, schafft mein server:
app.configure('development', function(){
app.use(express.cookieParser());
app.use(express.session({ secret:'yodawgyo' }));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.use(express.logger());
app.use(express.static(__dirname + '/public'));
app.set('view engine', 'ejs');
app.set('view options', {
open: '{{',
close: '}}'
});
});
Ich nur eine dev-Umgebung für jetzt. Ich habe Knoten 0.5.0-pre installiert, aber sah dieses Problem auf 0.4.1 als gut. Ich bin mit der express-2.3.2.
Jede Hilfe wird sehr geschätzt.
Update: wie es aussieht bekommen Sie eine unterschiedliche session-id für die Anfrage umgeleitet.
InformationsquelleAutor ehynds | 2011-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Connect-Sitzung, jeden handler kann eingestellt
req.session.anything
auf einen beliebigen Wert, und die Verbindung wird den Wert speichern, wenn Ihr handler ruftend()
. Dies ist gefährlich, wenn es mehrere Anfragen im Flug zur gleichen Zeit; wenn Sie fertig sind, ein session-Wert wird Klamotten der anderen. Dies ist die Folge der mit ein so einfaches session API (oder siehe Sitzung Quelle direkt), die nicht atomar get-und-set-session-Eigenschaften.Die Problemumgehung ist, um zu versuchen zu geben, die Sitzung middleware als paar von Anfragen notwendig. Hier sind einige Tipps:
express.static
- handler vor der Sitzung middleware.req.session
sagenexpress.session.ignore.push('/individual/path')
.req.session = null;
vor dem Aufrufres.end();
. Dann wird es nicht erneut gespeichert werden.Wenn nur eine Anfrage eine lese-modifizieren-schreiben an die Sitzung zu einem Zeitpunkt, der Stress wird weniger wahrscheinlich. Ich hoffe, dass in Zukunft Verbinden wird eine genauere Sitzung middleware, aber natürlich ist die API wird komplizierter sein als das was wir jetzt haben.
Vielen Dank für die tolle Erklärung. Ich habe öffnete sich ein Problem auf verbinden, es zu verfolgen: github.com/senchalabs/connect/issues/854
omg. Ihre 1. Lösung beseitigt. Für einige Grund meine session starb zwischen den Seiten POST. ich hatte keine Ahnung, warum. aber es eben Tat. Einmal zog ich das static vor der Sitzung middleware-es funktioniert!
was ist konstant? Ich habe keine solche Sache, und ich bin immer wie 18 doppelte Sitzung Zeilen in meiner Datenbank, wenn ich eine session-variable einmal aus einer route-handler.
InformationsquelleAutor yonran
Nur kämpfte mit dem gleichen problem und habe es gelöst.
Die einfache Antwort ist zu nennen,
explizit, wenn Sie keine Antworten auf express-session zu nennen, die Sie am Ende der Antwort.
Referenz
InformationsquelleAutor user2522152
Legte ich ein Frage gegen Express über github, aber herausgefunden, was falsch war wenige Minuten später. Nicht sicher, ob Sie das gleiche problem, aber zur Vollständigkeit:
In meinem Fall, ich wurde getestet, indem Sie auf http://localhost:8003 aber das OAuth-provider umleiten zu http://hostname:8003. Gleiche box/server/Webseite, aber verschiedene domain-Namen bedeutet, dass der browser sendet verschiedene cookies und folglich, express bekommt verschiedene session-ids und session-Daten. Sobald ich mit dem testen begonnen bei http://hostname:8003, alles hat Prima funktioniert.
InformationsquelleAutor Yevgeniy Brikman
Mein code war ähnlich wie deine, auch strukturell. In meinem Fall, aber meine POST-operation stammt aus dem JQuery -$.post-Funktion. Ich weiß nicht, ob das macht einen spürbaren Unterschied, jedoch
Was ich am Ende tun war, senden Sie einen "junk" - Antwort auf das Ende des POST-Vorgangs definition in meiner express-routing-routine, d.h.
res.send("hoo hee ha ha unimportant junk data");
Durch die Einbeziehung dieses am Ende war ich in der Lage, um die trigger-ein-Erfolg-Funktion (callback des AJAX-post-Versuch). Ich steckte den redirect gibt, statt es in der express-Routen.
Verwendung mit AJAX Post
window.redirect();
Nicht mit AJAX Post:
$res.redirect("someurl");
Dies ist, weil der Browser offenbar nicht umleiten auf AJAX-response, so dass Sie haben, Javascript zu verwenden, wie hier beschrieben: Express js - können nicht umleiten
Hoffe, das hilft jemand, der es behoben das problem für mich, Frieden.
Danke Anwar! Das erspart mir eine riesige Kopfschmerzen. Arbeitete ein Charme. Sehr seltsam, dass.
InformationsquelleAutor Anwar Hahj Jefferson-George