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

req.flash() not working after req.session.destroy()

根据条件,我需要销毁用户的当前会话,并将他重定向到带有消息的登录页面。我使用 flash 来获得只显示一次的消息。除了这里,这在我的应用程序上无处不在,因为这里我在 req.session.destroy() 之后使用 req.flash

我怎样才能做到这一点?我曾尝试将 req.flash() 放在 req.session.destroy() 之前,但这不起作用,我认为是因为 req.session.destroy() 清除了我们刚刚存储 flash 消息的会话。谢谢。

   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。如果我在 session.destroy 语句之前移动 flash 语句,那么我不会收到任何错误,但不会显示消息。

如果您查看 flash source,您可以看到此中间件 REQUIRE 会话才能工作

req.flash() 取决于有效的会话,因此如果您销毁该会话,则即时消息也会被销毁。

在我看来,创建一个单独的 "blocked" 页面并呈现它实际上可能更好,而不是将被阻止的用户重定向回登录页面(无论如何他们都无法登录) ):

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

作为(不太漂亮的)替代方法,您可以将查询字符串传递到登录页面,指示用户已被阻止:

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

并在登录模板中检查是否应显示 "you are blocked" 消息。

我意识到这是一个旧的 post,但以防万一它对某人有帮助。

看起来使用 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"