2016-12-22 13 views
0

Вот мой Middleware с PassportUser.findOne() Всегда бросать ошибку Не удается прочитать свойство '_id' неопределенных - NodeJS

passport.use('local-login', new LocalStrategy({ 
usernameField: 'email', 
passwordField: 'password', 
passReqToCallback: true 
}, function (req, email, password, done) { 
User.findOne({ email: email}, function (err, user) { 
    if (err) return done(err); 

    if(!user) { 
     return done(null, false, req.flash('loginMessage', 'No user found!')); 
    } 

    if (!user.comparePassword(password)) { 
     return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 
    } 

    return done(null, user); 
}); 
})); 

и это мой метод POST Войти

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

После этого я пытаюсь перенаправить на страницу профиля GET:

router.get('/profile', function (req, res, next) { 
    User.findOne({'user._id': req.user._id}, function (err, user) { 
     if (err) return next(err); 

     res.render('accounts/profile', { user : user}); 
    }); 
}); 

Регистрация метод woking правильно и отправить данные в базу данных, но также имеет ошибку перенаправления на страницу профиля с тем же TypeError!

Наконец, здесь зависимостей в package.json

"dependencies": { 
"bcrypt-nodejs": "0.0.3", 
"body-parser": "^1.15.2", 
"connect-mongo": "^1.3.2", 
"cookie-parser": "^1.4.3", 
"ejs": "^2.5.5", 
"ejs-mate": "^2.3.0", 
"express": "^4.14.0", 
"express-flash": "0.0.2", 
"express-session": "^1.14.2", 
"mongoose": "^4.7.4", 
"morgan": "^1.7.0", 
"passport": "^0.3.2", 
"passport-local": "^1.0.0" 
} 

Я надеюсь, что кто-то помогает мне, вот я застрял! Я не могу двигаться дальше.

+0

'req.user' похоже не определено. – str

+0

Я думаю, что пользователь не сериализуется для сеанса. – Bhavana

+0

@str Я определил его так: 'app.use (function (req, res, next) { res.locals.user = req.user; next(); });' –

ответ

0

Наконец я решил свою ошибку только Понизить некоторую зависимость в моем package.json файла зависимостей будут выглядеть примерно так:

"dependencies": { 
"bcrypt-nodejs": "0.0.3", 
"body-parser": "^1.14.2", 
"connect-mongo": "^1.1.0", 
"cookie-parser": "^1.4.0", 
"ejs": "^2.3.4", 
"ejs-mate": "^2.3.0", 
"express": "^4.13.3", 
"express-flash": "0.0.2", 
"express-session": "^1.12.1", 
"mongoose": "^4.3.4", 
"morgan": "^1.6.1", 
"passport": "^0.3.2", 
"passport-local": "^1.0.0" 
} 

Тогда все будет правильно, по крайней мере, в моем случае :) Спасибо всем.

1

здесь вы пытаетесь получить доступ к user_id непосредственно из объекта req.

User.findOne({'user._id': req.user._id}, 

изменить его

router.post('/profile', function (req, res, next) { 
User.findOne({'user._id': req.body.user._id}, function (err, user) { 
    if (err) return next(err); 

    res.render('accounts/profile', { user : user}); 
}); 

});

Вы не можете отправить данные в теле запроса GET. Поэтому измените его на POST, а затем, если вы не объявили промежуточное ПО bodyparser, сначала объявите его, тогда данные из вашего запроса POST будут доступны в вашем req.body.

+0

Спасибо большое за ваш комментарий, я думаю, что ваш ответ разрешил мою ошибку, , но теперь я получаю модель пользователя на странице профиля! и маршрут GET теперь не отправляют пользовательскую модель! Что мне делать? –

+0

Если вы заявили, что паспорт.serializeUser, который я верю, заключается в том, чтобы хранить пользователя в сеансе, а затем просто console.log (req.session) и получить пользователя _id оттуда, и вы можете сделать свой запрос. –

1

От docs, сериализация и десериализаций пользователя использовать следующий код сеанс

passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function (err, user) { 
    done(err, user); 
    }); 
}); 
+0

Я точно определил обе функции, такие как ваш код! –

+0

Я только заметил, что сессия не установлена! Я не знаю почему! –

+0

ohh .. 'local-login' - это название стратегии? Idk, как использовать пользовательские имена.Обычно я использую «локальную» стратегию. – Bhavana