2017-03-15 11 views
1

私のWebサイトの認証システムを作成しようとしています。Passport認証ReferenceError:ユーザーが定義されていません

しかしいかなる使ってログインしようとしている組み合わせ、私はウェブサイトで、次のエラーが発生します:

コンソールで
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); 
    }); 
} 

答えて

1

問題はここにある:

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.comparePassword関数をUser.getUserByEmailの中にネストするか、約束を使って適切に解決する必要があります。

0

まあ、プロンプトメッセージは、ユーザーが定義されていないことを示しています。 users.jsにスローされたメッセージエラーです。あなたが定義したパスポート戦略の名前は忘れてしまったと思います。 users.jsであなたのコードは次のようにする必要があります:

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

関連する問題