Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将req.flash()用于EJS?_Javascript_Node.js_Express_Ejs_Flash Message - Fatal编程技术网

Javascript 如何将req.flash()用于EJS?

Javascript 如何将req.flash()用于EJS?,javascript,node.js,express,ejs,flash-message,Javascript,Node.js,Express,Ejs,Flash Message,我希望能够通过Express和EJS向客户端快速发送消息。我已经找遍了,但仍然找不到示例或教程。有人能告诉我闪现信息的最简单方法吗 谢谢 req.flash() <% if ( message ) { %> <div class="flash"><%= message %></div> <% } %> 如果你使用两个参数 req.flash(type, message); 如果type是一种消息类型,message是实际消息

我希望能够通过Express和EJS向客户端快速发送消息。我已经找遍了,但仍然找不到示例或教程。有人能告诉我闪现信息的最简单方法吗

谢谢

req.flash()

<% if ( message ) { %>
    <div class="flash"><%= message %></div>
<% } %>
如果你使用两个参数

req.flash(type, message);
如果
type
是一种消息类型,
message
是实际消息(两个字符串),则它将
message
添加到
type
类型的队列中。只使用一个参数

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

var messages = req.flash('info');
然后将
messages
变量发送到模板,并在模板中使用它(注意
messages
是一个数组,您可以迭代它)。记住使用
req.flash('info','test')
将仅为当前用户(与
req
对象关联)附加类型为
info
test
消息


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

如果使用visionmedia的express messages helper模块,它将变得非常简单

正如模块文档中所述:

使用npm安装模块

npm install express-messages
然后在app.config中为消息分配动态帮助程序:

app.dynamicHelpers({ messages: require('express-messages') });
在您的EJS文件中,将以下内容插入到您希望发送消息的位置

<%- messages() %>

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

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

app.all('/express-flash', req, res ) {
  req.flash('success', 'This is a flash message using the express-flash module.');
  res.redirect(301, '/');
}
Next将消息映射到目标路由的
res.render()
方法中的模板,
baseurl/
。这里,
req.flash(type)
getter方法返回与类型
success
匹配的消息,这些消息映射到模板变量
expressFlash

app.get('/', req, res ) {
  res.render('index', {expressFlash: req.flash('success') });
}
最后,在
index.ejs
中显示
expressFlash
的值(如果存在)

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

0 ) { %> 信息:


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

我也在努力解决这个问题;让我的flash消息出现在我的.ejs中。 但是,我终于成功了,这就是我所理解的

一旦调用getter
req.flash(“\u msgName”)
,它就被清除了

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

我使用console.log()测试getter,它显示在我的控制台中,但不显示在我的.ejs中

这是我的一些代码

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>
    <% } %>
<% } %>
0){%>

这仍然没有告诉我如何在模板(EJS)中显示它。我已经知道
req.flash()
如何工作。所以你不知道如何使用模板引擎?那你为什么问
req.flash()
?这与
flash
无关。你知道如何在EJS中传递和使用变量吗?我从来没有说过。我的意思是,如何在我的视图中显示它?是的,使用Express+EJS已经很久了。只是从来没有使用过flash消息。它确实与flash有关,我想知道如何在m中显示flash消息y视图。这与显示普通字符串数组有什么不同?我不知道,既然我不知道是什么变量,为什么不告诉我转到视图。如果我知道这一点,我就不会发布此问题。很抱歉对一篇旧帖子发表评论,但express messages现在仅适用于express 2.x。为了更完整的解释,它包括两种flash消息传递方法,一种单独使用express session模块,另一种使用express flash模块。它因此在ejs、车把和jade中包含了模板。感谢@Poison Oak after hours,我刚刚意识到我在
中缺少了
=
首选此链接,兄弟,易于理解
<p> Express-Flash Demo </p>    
<% if ( expressFlash.length > 0 ) { %>
  <p>Message: <%= expressFlash %> </p>
<% } %>
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('/');
        }
    })
});
<% if(msg.length > 0) { %> 
    <% for (var error in msg) { %>
        <h3><%= msg[error] %></h3>
    <% } %>
<% } %>