我希望能够使用Express和EJS向客户端发送消息。我看了一遍,但仍然找不到示例或教程。有人能告诉我闪烁信息的最简单方法吗?
谢谢!
答案 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}}消息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>
<% } %>
<% } %>