如何从mongoose中检索数据并在每个页面中使用它

时间:2017-08-19 12:11:04

标签: javascript node.js mongodb mongoose passport.js

我创建了一个简单的网站,用户必须在其中注册并订阅一些激活的挑战。我使用护照进行注册和登录表单,并将用户电子邮件和密码保存到我的数据库中。问题是当我尝试在另一个页面中使用用户电子邮件时。 一旦用户完成登录,我的应用程序会将他重定向到个人资料页面,然后我可以从数据库中检索数据,但是当我尝试在另一个页面中使用数据时,我无法做到。 有人知道如何解决这个问题吗?

我的护照档案

  passport.use('local-login', new LocalStrategy({
    // by default, local strategy uses username and password, we will         override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
    function(req, email, password, done) { // callback with email and password from our form

        // find a user whose email is the same as the forms email
        // we are checking to see if the user trying to login already exists
        User.findOne({ 'local.email' :  email }, function(err, user) {
            // if there are any errors, return the error before anything else
            if (err)
                return done(err);

            // if no user is found, return the message
            if (!user)
                return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash

            // if the user is found but the password is wrong
            if (!user.validPassword(password))
                return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata

            // all is well, return successful user
            return done(null, user);
        });

    }));

这是我的重定向页面

  app.get('/login', function(req, res) {

    // render the page and pass in any flash data if it exists
    res.render('login.ejs', { message: req.flash('loginMessage') });
});

// process the login form
// app.post('/login', do all our passport stuff here);
app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/partecipant', // redirect to the secure profile section
    failureRedirect : '/login', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));

我的partecipant页面,在这里我可以使用这个变量

检索数据

        <p>id: <%= user.id %></p>


        <p>email:<%= user.local.email %></p>

        <p>password: <%= user.local.password %></p>

这是另一个页面,我尝试使用与partecipant页面中使用的相同的变量,但它没有工作

 <section id="wrapPartecipant1">
            <p>email:<%= user.local.email %></p>
    </section>

1 个答案:

答案 0 :(得分:0)

使用Passport对用户进行身份验证后,用户应存储在req.user

app.get('/particepant', function(req, res) {
    console.log(req.user);
});

然后您可以创建一个local variable that is accessible to all views。您可以在中间件中设置此变量。

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

app.get('/particepant', function(req, res) {
    console.log(req.user);
});

// and other routes