未定义的消息变量NodeJS

时间:2017-11-25 16:40:05

标签: node.js express passport.js passport-local

我一直在关注我的节点应用程序的本教程以实现身份验证:https://scotch.io/tutorials/easy-node-authentication-setup-and-local

我遇到的问题是我在运行应用程序时出现此错误:(根据上述网站,我的代码很简单。)

enter image description here

我尝试寻找答案,但我能得到的最好的就是将此功能添加到我的服务器代码中:

app.use(function(req, res, next){
    res.locals.message = req.flash();
    next();
});

这会加载应用程序而不会出现任何错误,但是我的前端似乎没有显示该消息。不确定为什么,但我只是在这个项目中遇到这个问题,我可以在我的其他项目中实现消息而没有任何问题。

我在下面添加了我的github链接,但是我的代码中有些内容:

routes.js

app.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/dashboard',
    failureRedirect : '/#contact',
    failureFlash : true
}));

passport.js

if (user) {
    return done(null, false, req.flash('signupMessage', 'Email already in use!'));
}

index.ejs

<% if (message.length > 0) { %>
    <div class="alert alert-danger"><%= message %></div>
<% } %>

Github项目:https://github.coventry.ac.uk/salmanfazal01/304CEM-Back-End

1 个答案:

答案 0 :(得分:1)

从错误中我认为你没有将变量message正确地传递给ejs视图。

所以你有2个解决方案

1-在routes.js文件中,您需要在呈现index视图时传递消息,这就是您所关注的示例的完成方式。

所以改变

//GET homepage
app.get('/', function(req, res) {
    res.render('index');
}); 

//GET homepage
app.get('/', function(req, res) {
    res.render('index' , {message: <your data> });
}); 


2-使用res.localsres.flash这是您找到的解决方案,但实际上并没有传递req.flash()中的任何值

所以替换这段代码

app.use(function(req, res, next){
    res.locals.message = req.flash();
    next();
});

app.use(function(req, res, next){
    req.flash("info" , "first message"); //here you add message under type info
    req.flash("info" , "second message"); // here you add another message under type info

    next();
});

并在route.js

    app.get('/', function(req, res) {
        res.render('index' , {message : req.flash("info")}); //set message from req.flash type info
    });

    //or

   app.get('/', function(req, res) {
        res.locals.message = req.flash("info"); //set locals.message from req.flash type info 
        res.render('index');
    });