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

我希望能够通过Express和EJS向客户端刷新消息。 我已经看遍了,我仍然无法find一个例子或教程。 有人能告诉我最简单的方法来刷新消息?

谢谢!

我知道这是一个老问题,但最近我试图了解自己的Flash消息和模板时遇到了这个问题,所以我希望这能帮助其他人解决我的问题。 考虑到Express 4,Express-Flash模块和ejs模板的情况,这里有两条路线和一个模板,可以帮助你开始。

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

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

接下来将消息映射到目标路由baseurl/res.render()方法中的模板。 这里的req.flash(type) getter方法返回匹配typessuccess消息,这些消息被映射到模板variablesexpressFlash

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

最后 ,在expressFlash显示expressFlash的值(如果存在)。

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

然后启动服务器并访问baseurl/express-flash 。 它应该触发一个redirect到baseurl/的Flash消息。 现在刷新baseurl/并看到消息消失。

 <% if ( message ) { %> <div class="flash"><%= message %></div> <% } %> 

这是你想要的吗? 你可以使用一些客户端的JS来淡出。 jQuery的例子:

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

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

如果你使用两个参数

 req.flash(type, message); 

其中type是消息types,message是实际消息(都是string),然后将message添加到type type的队列中。 用一个参数来使用它

 req.flash(type); 

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

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

然后发送messagesvariables到模板并在那里使用它(注意messages是一个数组,你可以迭代它)。 记住使用req.flash('info', 'test');为当前用户(与req对象关联)附加typesinfotest消息。

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

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

正如它在模块的文档中所说:

用npm安装模块

 npm install express-messages 

然后为app.config中的消息分配一个dynamic帮助器:

 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');