【问题标题】:getting err- messages not defined in ejs file (when using flash in express)获取 ejs 文件中未定义的错误消息(在 express 中使用 flash 时)
【发布时间】:2021-10-12 04:31:45
【问题描述】:

我正在尝试打印以在 ejs 文件中打印一条闪存消息。但它抛出了一个错误。

**ReferenceError: E:\nodeProject\views\login.ejs:10
    8| <body>
    9|     <h1>Login</h1>
 >> 10|     <% if(messages.error){%>
    11|         <%=messages.error%>
    12|         <%}%>
messages is not defined.**

我已将 server.js 作为我的主要 js 文件。我已经安装了所需的模块,但出现的问题是因为它无法识别我的 ejs 文件中的“messages.error”。我的主 js (server.js) 文件中的一些语句是:

const initializePassport=require('./passport-config');
const passport=require('passport');
const flash=require('express-flash');
const session=require('express-session');
const router=express.Router();

app.use(session({
    secret:process.env.SESSION_SECRET,
    resave :false,//if we want to resave the session variables if nothing has changed
    saveUninitialized:false//do u want to save an empty value if there is no value

}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session()); 

router.route('/login').post(passport.authenticate('local',{
    successRedirect:'/',
    failureRedirect:'/login',
    failureFlash:true, 
}));

initializePassport(passport,email=>{
    MongoClient.connect(url,(err,db)=>{
        if(err) throw err;
        const dBase=db.db();
        dBase.collection('Users').find({email:email},(err,res)=>{
            if(err) throw err;
            console.log(res);
        })
        return res;
        db.close();
    });    
});

这是我的 passport-config.js 文件。在这里,我已经声明了护照在发生时应显示为错误的消息。我的 passport-config.js 文件是:

const localStrategy=require('passport-local').Strategy
const bcrypt=require('bcrypt');

function initialize(passport,getUserByEmail){
    const authenticateUser= async(email,password,done)=>{
        const user=getUserByEmail(email);
        if(user==null)
        {
            return done(null,false,{message:"No user with this email found"});                                                                    
        }
        try {
            if(await bcrypt.compare(password,user.password)){
                return done(null,user);
            }
            else{
                return done(null,false,{message:"Password does not match "});
            }

        } catch (error) {
            return done(error);          
        }
    }
    passport.use(new localStrategy({userName:'email'},authenticateUser));  
}
module.exports= initialize;

** 这是我使用messages.error并收到未定义消息的错误的ejs文件:**

<body>
    <h1>Login</h1>
    <% if(messages.error){%>
        <%=messages.error%>
        <%}%>



    <form action="/register" method="post">

    <div>
        <label for="name">Name</label>
        <input type="text" id="name" name="name" required>
    </div>
    <div>
        <label for="email">Email</label>
        <input type="email" id="email" name="email" required>
    </div>
    <div>
        <label for="password">Password</label>
        <input type="password" id="password" name="password" required>
    </div>
    <button type="submit">Login</button>
    </form>

    <a href="/register">Register</a>
</body>

请看一下并告诉我出了什么问题。我是初学者,所以请不要介意我的提问方式不恰当。谢谢。

【问题讨论】:

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


    【解决方案1】:

    我建议在你的主 server.js/app.js 文件中设置一个中间件,如下所示:

    app.use((req, res, next) => {
      res.locals.success = req.flash("success");
      res.locals.error = req.flash("error");
      next();
    });
    
    

    这将确保变量successerror 确实存在。

    在你的 ejs 文件中,在使用变量之前做这样的空检查:(注意这里,使用error 而不是messages.error

    <% if(error != ''){ %>
    

    有点晚了,希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2021-07-31
      • 2021-06-30
      • 2022-01-16
      相关资源
      最近更新 更多