Jade中的Flash Messages

3

根据这个例子:http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local,一切正常,除了Flash消息部分。

我已经将视图引擎从EJS更改为Jade,但似乎无法显示Flash消息。

EJS视图中提供的代码如下:

<% if (message.length > 0) { %>
  <div class="alert alert-danger"><%= message %></div>
<% } %>

我本以为我可以用Jade来代替这个:

if #{message}
  p message

甚至更多:
if message
  p message

但是没有成功。你有什么想法我做错了什么吗?
注意:根据教程,我已经包含了所有必要的库。
3个回答

8

以下是我在Jade中使用闪存的方法...

-if(messages)
        div#note #{messages}

使用以下代码在视图中渲染信息,将messages变量传递到你的视图中

req.flash('info', "Credenciales invalidas, intente nuevamente");
res.render('index', {messages: req.flash('info')});

这对我来说没问题。

闪存消息是在Passportjs策略中设置的,然后我使用FailureRedirect - 闪存消息仍然可用吗? - tommyd456
它不起作用 - 那么我如何使用FailureRedirect呈现登录页面 - 我需要使用自定义回调吗? - tommyd456
我不是护照专家,但我猜使用自定义回调函数应该可以解决这个问题。 - martskins
@tommyd456,我尝试了上面的jade代码,即使FailureRedirect到“login”页面也可以正常工作。你需要将res.render('login', { message: req.flash('loginMessage') });放到你的路由app.get('/login')中,并使用-if(messages.length)代替。 - Xianlin

1

我继续使用自定义回调函数,代码如下:

app.post('/login', function(req, res, next) {
        passport.authenticate('local-login', function(err, user, info) {
            if (err) { return next(err); }
            if (!user) { return res.render('login', {message: req.flash('loginMessage')}); }
            req.logIn(user, function(err) {
                if (err) { return next(err); }
                return res.redirect('/users/' + user.username);
            });
        })(req, res, next);
    });

0

这对我有用(由@Xianlin评论)。路由:

app.get('/login', function(req, res) {
    res.render('login', { message: req.flash('loginMessage') });
});

app.post('/login', urlencodedParser, passport.authenticate('local-login', {
    successRedirect : '/profile',
    failureRedirect : '/login',
    failureFlash : true
}));

使用 Passport 返回所需的错误消息:

return done(null, false, req.flash('loginMessage', 'That email address does not exist'));

最后在Jade中:
if (message.length > 0)
  #alert
    p= message

希望这能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接