簡體   English   中英

req.flash() 在 req.session.destroy() 之后不工作

[英]req.flash() not working after req.session.destroy()

根據條件,我需要銷毀用戶當前的 session,並將他重定向到帶有消息的登錄頁面。 我使用flash來獲得只顯示一次的消息。 除了這里,這在我的應用程序上無處不在,因為在這里我在req.session.destroy()之后使用req.flash

我怎樣才能做到這一點? 我曾嘗試將req.flash()放在 req.session.destroy() 之前, req.session.destroy()不起作用,我認為是因為req.session.destroy()清除了我們剛剛存儲 flash 消息的 session。 謝謝。

   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()
        });
    }

使用此代碼,我收到此錯誤 - Error: req.flash() requires sessions 如果我將 flash 語句移動到session.destroy語句之前,那么我不會收到任何錯誤,但不會顯示消息。

如果您查看flash 源代碼,您可以看到此中間件需要session才能工作

req.flash()取決於有效的 session,因此如果您銷毀該 session,則 flash 消息也會被銷毀。

在我看來,創建一個單獨的“被阻止”頁面並呈現它實際上可能更好,而不是將被阻止的用戶重定向回登錄頁面(無論如何他們都無法登錄):

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

作為(不太漂亮的)替代方案,您可以將查詢字符串傳遞到登錄頁面,指示用戶被阻止:

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

並檢查登錄模板,看看它是否應該顯示“您被阻止”的消息。

我現在意識到這是一篇舊文章,但以防萬一它對某人有幫助。

看起來像使用req.logout(); 做的伎倆,這允許req.flash(); 之后有效地調用。

"Node version": "14.16.1"
"express": "4.17.2"
"express-session": "1.17.2"
"passport": "0.5.2"
"connect-flash": "0.1.1"
"cookie-parser": "1.4.6"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM