8
votes

Nœud.js - la session ne persiste pas via res.redirect ()

Je suis (presque) à l'aide de Node.js avec Express et Redis pour gérer des sessions.

Le problème que je vais avoir est que la session n'est pas conservée lorsque j'utilise res.redirect () .

Hère est comment je peux le voir: p> xxx pré>

la console.log () Imprime: P>

app.configure(function() {
  // Defines the view folder and engine used.
  this.set('views', path.join(__dirname, 'views'));
  this.set('view engine', 'ejs');

  // Allow parsing form data
  this.use(express.bodyParser());

  // Allow parsing cookies from request headers
  this.use(express.cookieParser());
  // Session management
  this.use(express.session({
    // Private crypting key
    secret: 'keyboard cat',
    store: new RedisStore,
    cookie: {
      maxAge: 60000
    }
  }));
  this.use(app.router);
});


5 commentaires

Pouvez-vous également coller le code où vous y compris le magasin de session ReDIS? Il y a une option de délai d'expiration là-bas, peut-être que vous le réglez accidentellement trop bas.


Ajouté :) Il est défini à 60 secondes et je n'utilise clairement pas 60 secondes pour écrire les informations d'identification ...


Je suppose que c'est un petit projet, je pense qu'il est préférable de le poster quelque part (gist, pastique) et donner un lien. Je parie que l'erreur est d'une manière ou d'une autre dans un code que vous ne collez pas. (juste une hypothèse)


Ajouté le lien GIST à la fin


@Florian je vote pour vous. C'est le plus que je puisse faire ici pour vous :-)


5 Réponses :


1
votes

Votre code semble assez solide, mais y a-t-il une raison pour laquelle vous utilisez client.end ()? Il ferme de force la connexion Redis et n'est pas propre. Je ne pense pas que vous en ayez besoin du tout:

https://github.com/mrananney/node_redis/issues/74 < / p>

Je ne suis pas sûr de l'architecture sous-jacente pour Connect-Redis, mais je me demande si appeler client.end est ce qui réinitialisait vos sessions. Que se passe-t-il si vous les prenez?


1 commentaires

Merci, je ne le savais pas. Je pensais que ce serait plus propre. Cela ne résout pas le problème, mais je suis + 1 'vous :)



0
votes

Vous devez sûrement économiser cette session d'une manière ou d'une autre, cela pourrait fonctionner.

req.session.regenerate(function(){
    req.session.username = username.toString();
    res.redirect('/home');
});


2 commentaires

Cela ne change rien, malheureusement. Au fait, quel est le point de cette fonction régénérée?


Si vous allez modifier les données stockées dans une base de données persistante, il est logique que vous aurez besoin de Enregistrer il avant de pouvoir l'utiliser dans d'autres parties de votre système. Je suis surpris que req.session.Ausername variable persiste sans sauver quoi que ce soit ... peut-être que cela se fait automatiquement comme une fonctionnalité



2
votes

Avez-vous essayé avec différents navigateurs? Conservez-vous le même identifiant de session entre les redirections de page?

Vous pouvez ajouter req.session.cookie.expires = false; avant de rediriger ...


0 commentaires

7
votes

D'accord, j'ai trouvé la solution. Le problème est que l'heure dans maxage a été ajoutée à la date actuelle. Donc, du côté du navigateur, le cookie devait expirer à l'heure GMT indiquée.

Le problème était le suivant: J'utilise une machine virtuelle pour tester node.js, et vous savez ... Parfois, vous suspendez votre machine.

Eh bien, que s'est-il passé, c'est que le temps de la machine était de deux jours de retard. Donc, chaque fois que le cookie était défini sur le serveur, le côté du client a jugé que le cookie était déjà expiré, car ma machine hôte n'était pas deux jours de retard.

Un autre résultat stupide.


1 commentaires

Hey, j'ai un problème similaire. Pourriez-vous s'il vous plaît m'aider ici ici. Stackoverflow.com/questions/64512910/...



1
votes

J'avais un problème similaire dans lequel je fixais quelque chose sur la session qui ne persiste pas en dehors du app.get () Il a été installé.

Mon problème s'est avéré être que j'étais pas faire un res.redirect () à la fin de mon app.get () . On dirait que je fixais quelque chose sur un objet de requête puis de lui permettre de recueillir des ordures.

J'ai ajouté un res.redirect ('/ nextmethod') et les données persistent bien.


0 commentaires