如何在EJS中使用req.flash()?

时间:2012-06-25 18:00:48

标签: javascript node.js express ejs flash-message

我希望能够使用Express和EJS向客户端发送消息。我看了一遍,但仍然找不到示例或教程。有人能告诉我闪烁信息的最简单方法吗?

谢谢!

5 个答案:

答案 0 :(得分:5)

我知道这是一个老问题,但我最近在尝试自己理解Flash消息和模板时碰到了它,所以我希望这能帮助我处理其他人。考虑到Express 4,express-flash模块和ejs模板的情况,这里有两条路线和一个可以帮助你入门的模板。

首先生成您要显示的Flash消息。这里app.all()方法映射到/express-flash。在重定向到baseurl/express-flash之前,请req.flash(type, message)使用baseurl/ setter方法创建消息。

app.all('/express-flash', req, res ) {
  req.flash('success', 'This is a flash message using the express-flash module.');
  res.redirect(301, '/');
}

下一步将邮件映射到目标路由的res.render()方法中的模板baseurl/。这里req.flash(type) getter方法返回与类型success匹配的消息,这些消息映射到模板变量expressFlash

app.get('/', req, res ) {
  res.render('index', {expressFlash: req.flash('success') });
}

最后,在expressFlash中显示index.ejs的值(如果存在)。

<p> Express-Flash Demo </p>    
<% if ( expressFlash.length > 0 ) { %>
  <p>Message: <%= expressFlash %> </p>
<% } %>

然后启动服务器并访问baseurl/express-flash。它应该使用flash消息触发重定向到baseurl/。现在刷新baseurl/并看到消息消失。

答案 1 :(得分:3)

<% if ( message ) { %>
    <div class="flash"><%= message %></div>
<% } %>
这是你想要的吗?您可以使用一些客户端JS来淡出它。 jQuery示例:

var message = $( '.message' );
if ( message.length ) {
    setTimeout( function() {
        message.fadeOut( 'slow' );
    }, 5000 );
}

答案 2 :(得分:1)

req.flash()可以通过两种方式使用。

如果使用两个参数

req.flash(type, message);

其中type是一种消息,message是实际消息(两个字符串),然后它将message添加到type类型的队列中。使用一个参数

req.flash(type);

返回类型为type的所有消息的数组,并清空队列。此外,此方法附加到会话,因此它适用于每个会话。换句话说,每个用户都有自己的一组闪存队列。因此,在您看来,您可以这样做:

var messages = req.flash('info');

然后将messages变量发送到模板并在那里使用(请注意messages是一个数组,您可以迭代它)。请注意,使用req.flash('info', 'test');会为当前用户(与test对象相关联)添加info 类型<{1}}消息

请记住,这种机制非常薄弱。例如,如果用户双击链接(两个请求发送到服务器),那么他将不会看到消息,因为第一个调用将清空队列(当然,除非请求生成消息)。

答案 3 :(得分:0)

如果您使用visionmedia的快速消息帮助程序模块,它将变得非常简单。 Github link

正如模块的文档中所述:

使用npm

安装模块
npm install express-messages

然后为app.config中的消息分配动态帮助程序:

app.dynamicHelpers({ messages: require('express-messages') });

在您的EJS文件中,在您想要消息的位置插入以下内容

<%- messages() %>

EJS将其转换为:

<div id="messages">
  <ul class="info">
    <li>Email queued</li>
    <li>Email sent</li>
  </ul>
  <ul class="error">
    <li>Email delivery failed</li>
  </ul>
</div>

(当然,您可以在模块的代码中更改它呈现的内容)

然后,要实际刷新消息,请拨打以下电话:

req.flash('info', 'Your message goes here');

答案 4 :(得分:0)

我也在为此苦苦挣扎;使我的Flash消息出现在我的.ejs中。 但是,我终于把它付诸实践,这就是我的理解。

调用吸气剂req.flash('_msgName_');后,将清除

此外,当您app.use(session()); cookie必须等于cookie: {maxAge: 720}时,本质上是一个很大的数字。

我正在使用console.log()测试吸气剂,它显示在我的控制台中,而不显示在我的.ejs中。我拿出console.log()并成功了。

这是我的一些代码。

Server.js〜

app.get('/', function(req, res) {
    // This is where we will retrieve the users from the database and include them in the view page we will be rendering.
    User.find({},function(err, allUsers){
        if(err){
            console.log("Oh no we got an error\n ERROR :: "+err);
        } else {
            // console.log(allUsers);
            res.render('index',{users : allUsers, msg : req.flash('vError')});
        }
    });
});

// Add User Request 
app.post('/users', function(req, res) {
    console.log("REQUESTED DATA:\t", req.body);
    var user = new User(
        {
            name: req.body.name, 
            age: req.body.age
        }
    );
    // Saves user to DB.
    user.save(function(err) {
        if(err) {
            console.log('OOPS, Something went Wrong... \n ERROR :: '+err+'\n');
            for(var key in err.errors){
                // console.log(err.errors[key].message);
                req.flash('vError', err.errors[key].message);
            }
            // **HERE I WAS ACCIDENTALLY CLEARING IT!!!** \\
            // console.log(req.flash('vError')); 
            // res.render('index',{users : [], msg : req.flash('vError')});
            res.redirect('/');
        } else { 
          console.log('\tSuccessfully added a new User to the DB!');
          res.redirect('/');
        }
    })
});

index.ejs〜

<% if(msg.length > 0) { %> 
    <% for (var error in msg) { %>
        <h3><%= msg[error] %></h3>
    <% } %>
<% } %>