如何在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');
然后发送messages
variables到模板并在那里使用它(注意messages
是一个数组,你可以迭代它)。 记住使用req.flash('info', 'test');
将只为当前用户(与req
对象关联)附加typesinfo
的test
消息。
请记住,这个机制是相当薄弱的。 例如,如果用户双击链接(两个请求发送到服务器),那么他将不会看到消息,因为第一个调用将清空队列(当然,除非请求生成消息)。
如果您使用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');