2017-07-17 3 views
0

En fonction d'une condition, je dois détruire la session en cours de l'utilisateur et le rediriger vers une page de connexion avec un message. J'utilise flash pour avoir un message show-once-only. Partout, cela fonctionne très bien sur mon application sauf ici, car ici j'utilise req.flash après req.session.destroy().req.flash() ne fonctionne pas après req.session.destroy()

Comment puis-je y parvenir? J'ai essayé de placer req.flash() avant req.session.destroy() mais cela ne fonctionne pas, je pense que req.session.destroy() efface la session où nous avons juste stocké le message instantané. Merci.

if(req.session.adminUser.blocked){ 
     req.logout(); 
     req.session.destroy(()=>{ 
      req.flash("flashMessage", "You are blocked, Please contact admin"); 
      req.session.save(function(){ 
       res.redirect("/admin-panel/login"); 
       return false; 
      });//session.save() 
     }); 
    } 

Avec ce code, j'obtiens cette erreur - Error: req.flash() requires sessions. Si je déplace l'instruction flash avant l'instruction session.destroy, aucune erreur ne se produit, mais le message n'apparaît pas.

Répondre

1

req.flash() dépend d'une session valide, donc si vous détruisiez cette session, les messages flash sont détruits ainsi.

Il me semble qu'il serait peut-être préférable de créer une page "bloquée" distincte, et de la restituer, au lieu de rediriger la page bloquée vers la page de connexion (où elle ne peut pas se connecter):

req.session.save(function(){ 
    res.render("/admin-panel/blocked"); 
}); 

en (moins jolie) alternative, vous pouvez passer une chaîne de requête à la page de connexion indiquant que l'utilisateur a été bloqué:

res.redirect("/admin-panel/login?blocked=true"); 

Et utiliser un chèque login modèle pour voir si le message "Vous êtes bloqué" s'affiche.

+0

Merci beaucoup. Vos deux alternatives me semblent plutôt bien. :) –

0

Si vous regardez flash source vous pouvez voir que ce middleware EXIGENT session pour travailler

+0

Merci. Mais je sais cela et j'ai déjà utilisé la session. Et comme je l'ai mentionné, cela fonctionne très bien partout dans mon application. Le problème est que cela ne fonctionne pas dans le rappel après avoir appelé 'req.session.destroy()'. –

+0

Après avoir appelé 'req.session.destroy()' il n'y a pas de 'session' à utiliser par' flash' alors comment voulez-vous que cela fonctionne? –

+0

Y at-il un moyen de faire ce travail? Vous comprenez mon exigence? Si un utilisateur est bloqué, je dois le déconnecter en détruisant sa session, puis le rediriger vers l'écran de connexion. Mais avec un message flash, que vous avez été bloqué. –