User.findOne() 总是抛出错误 Cannot read 属性 '_id' of undefined - NodeJS
User.findOne() Always throw error Cannot read property '_id' of undefined - NodeJS
这是我的中间件 Passport
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 Profile 页面:
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});
});
});
注册方法正确启动并将数据发送到数据库,但它也有错误重定向到具有相同类型错误的配置文件页面!
最后,这里是 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"
}
我希望有人能帮助我,我被困在这里了!我无法继续前进。
此处您正尝试直接从请求对象访问 user_id。
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.[=12 中可用=]
从 docs 开始,要将用户序列化和反序列化为会话,请使用以下代码
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
最后我通过降级 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"
}
然后一切正常,至少在我的情况下:)
谢谢大家。
这是我的中间件 Passport
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 Profile 页面:
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});
});
});
注册方法正确启动并将数据发送到数据库,但它也有错误重定向到具有相同类型错误的配置文件页面!
最后,这里是 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"
}
我希望有人能帮助我,我被困在这里了!我无法继续前进。
此处您正尝试直接从请求对象访问 user_id。
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.[=12 中可用=]
从 docs 开始,要将用户序列化和反序列化为会话,请使用以下代码
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
最后我通过降级 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"
}
然后一切正常,至少在我的情况下:) 谢谢大家。