Node.js & amp; Problème de session express
Je vais avoir un problème avec les sessions, où, parfois, la variable de session je juste ensemble
n'est pas défini sur la page suivante demande. En général, je dois passer par le flux
de nouveau afin de bien définir les variables.
Je peux confirmer que je ne suis pas en train de définir les variables de session pour undefined; ils ont une pièce de théâtre en valeur.
Dans mon application, les utilisateurs passent d' /twitter/connect//twitter/rappel/. L'ancien récupère certains oauth les données de twitter, ce dernier se connecte l'utilisateur sur twitter.
/twitter/se connecter/est simple:
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);
}
});
});
Après cela, twitter renvoie à /twitter/rappel/:
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.
});
Je n'ai aucune idée de ce qu'il se passe, je peux confirmer que les variables de session sont fixés correctement, ils ne sont simplement pas la tenue de leur valeur entre les demandes de page, mais seulement la première fois.
C'est la façon dont je suis la création de mon serveur:
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: '}}'
});
});
Je viens d'avoir un environnement de dev pour l'instant. J'ai Nœud 0.5.0-pré-installé, mais vu ce problème sur 0.4.1. Je suis à l'aide d'exprimer 2.3.2.
Toute aide est très appréciée.
source d'informationauteur ehynds
Vous devez vous connecter pour publier un commentaire.
Dans Connect session, un gestionnaire peut définir des
req.session.anything
de toute valeur, et Connectez va stocker la valeur lors de votre gestionnaire d'appelsend()
. C'est dangereux si il y a plusieurs demandes en vol en même temps; quand ils ont fini, une session de la valeur de tabasser l'autre. C'est la conséquence du fait d'avoir un simple session de l'API (ou voir la session de la source directement), ce qui n'a pas de support pour atomiquement obtenir et définir les propriétés de session.La solution de contournement est d'essayer de donner de la session middleware que quelques-uns des demandes que nécessaire. Voici quelques conseils:
express.static
gestionnaire au-dessus de la session middleware.req.session
en disantexpress.session.ignore.push('/individual/path')
.req.session = null;
avant d'appelerres.end();
. Ensuite, il ne sera pas ré-enregistré.Si une seule demande de lecture-modification-écriture pour la session à la fois, casser les moins susceptibles. J'espère que dans l'avenir, Connectez aura plus précis session middleware, mais bien sûr, l'API va être plus compliqué que ce que nous avons maintenant.
Juste du mal avec le même problème et a obtenu qu'il soit résolu.
La réponse la plus simple est d'appeler
explicitement, si vous ne pouvez pas répondre sur express-session de l'appeler pour vous à la fin de la réponse.
Référence
J'ai déposé un question contre Express sur githubmais compris ce qui n'allait pas, quelques minutes plus tard. Vous ne savez pas si vous rencontrez le même problème, mais pour l'exhaustivité:
Dans mon cas, j'ai été le tester en allant à http://localhost:8003 mais OAuth fournisseur était de la redirection vers http://nom d'hôte:8003. Même boîte/serveur/pages web, mais de différents noms de domaine signifie que le navigateur envoie des cookies, et, par conséquent, express obtient différents id de session et de la session de données. Dès que j'ai commencé à tester à http://nom d'hôte:8003tout a très bien fonctionné.
Mon code était semblable à la vôtre, structurellement. Dans mon cas, cependant, mon POST opération originaire de la JQuery $.post de fonction. Je ne sais pas si cela fait une différence sensible, cependant
Ce que j'ai fini par avoir à faire était d'envoyer un "indésirable" réponse à la fin de l'opération POST définition de mon express de routage de routine, c'est à dire
res.send("hoo hee ha ha unimportant junk data");
Par là, à la fin j'ai été en mesure de déclencher un succès fonction (la fonction de rappel pour l'AJAX tentative de post). J'ai inséré le rediriger là, au lieu de le placer dans les voies express.
Utiliser avec AJAX Post
window.redirect();
Ne pas utiliser avec de l'AJAX Post:
$res.redirect("someurl");
C'est parce que les navigateurs auront apparemment pas de redirection sur AJAX de réponse, de sorte que vous avez à l'utilisation de Javascript, comme décrit ici: Express js - ne peut pas rediriger
Espère que ça aide quelqu'un, il a résolu le problème pour moi, la paix.