Passport身份validationReferenceError:用户未定义

我正在尝试为我的网站制作一个身份validation系统。

但是当试图用任何组合login时,我在网站上收到以下错误:

ReferenceError: user is not defined user is not defined ReferenceError: user is not defined at Strategy._verify (/home/jarno/0__projects/nodejs/EasyOrders/routes/users.js:76:36) at Strategy.authenticate (/home/jarno/0__projects/nodejs/EasyOrders/node_modules/passport-local/lib/strategy.js:90:12) at attempt (/home/jarno/0__projects/nodejs/EasyOrders/node_modules... 

在控制台中:

 POST /users/login 500 204.677 ms - 3063 events.js:160 throw er; // Unhandled 'error' event ^ Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (/home/jarno/0__projects/nodejs/EasyOrders/node_modules/express/lib/response.js:719:10)... 

我的代码:

Users.js

 passport.use(new LocalStrategy({ usernameField: 'email' }, function(email, password, done) { User.getUserByEmail(email, function(err, user) { if(err) throw err; if(!user) { return done(null, false, {message: 'Unknown User'}); } }); User.comparePassword(password, user.password, function(err, isMatch) { if(err) throw err; if(isMatch) { return done(null, user); } else { return done(null, false, {message: 'Invalid password'}); } }); } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.getUserById(id, function(err, user) { done(err, user); }); }); router.post('/login', passport.authenticate('local', {successRedirect: '/', failureRedirect:'/users/login', failureFlash: true}), function(req, res) { res.redirect('/'); }); module.exports = router; 

User.js模型:

 var UserSchema = mongoose.Schema({ email: { type: String, index: true }, name: { type: String }, password: { type: String }, }); var User = module.exports = mongoose.model('User', UserSchema); module.exports.createUser = function(newUser, callback) { bcrypt.genSalt(10, function(err, salt) { bcrypt.hash(newUser.password, salt, function(err, hash) { newUser.password = hash; newUser.save(callback); }); }); } module.exports.getUserByEmail = function(email, callback) { var query = {email: email}; User.findOne(query, callback); } module.exports.getUserById = function(id, callback) { User.findById(id, callback); } module.exports.comparePassword = function(candidatePassword, hash, callback) { bcrypt.compare(candidatePassword, hash, function(err, isMatch) { if(err) throw err; callback(null, isMatch); }); } 

问题在这里:

 User.getUserByEmail(email, function(err, user) { if(err) throw err; if(!user) { return done(null, false, {message: 'Unknown User'}); } }); User.comparePassword(password, user.password, function(err, isMatch) { if(err) throw err; if(isMatch) { return done(null, user); } else { return done(null, false, {message: 'Invalid password'}); } }); 

你正在尝试使用user.password时,它尚未定义。 您需要在User.getUserByEmail中嵌套User.comparePassword函数,或者使用promise来正确parsing它。

那么提示消息显示用户没有定义。 这是在users.js中的错误信息。我想,你忘了提到你定义的护照战略的名字。 您在users.js中的代码应该是这样的:

  passport.use('local', new LocalStrategy({.......})