Я пытаюсь реализовать локальную аутентификацию с помощью Compoundjs, Passportjs (составной паспорт) и Bcryptjs. Вот мой код:NodeJS - ошибка с обратными вызовами
определить новую стратегию
var Strategy = require('passport-local').Strategy;
passport.use(new Strategy({
usernameField: conf.usernameField || 'email'
}, exports.callback));
функция обратного вызова
exports.callback = function (email, password, done) {
exports.User.findOrCreate({
email: email,
password: password
}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(err, false);
}
var len = exports.User.verifyPassword.length;
if (len === 2) {
if (!exports.User.verifyPassword(password, user.password)) {
return done(err, false);
} else {
return done(err, user);
}
} else if (len === 3) {
exports.User.verifyPassword(password, user.password, function(err, isMatch) {
return done(err, !err && isMatch ? user : false);
});
}
return done(err, false);
});
};
User.verifyPassword
User.verifyPassword = function verifyPassword(password, hash, cb) {
bcrypt.compare(password, hash, function(err, isMatch) {
if(err) return cb(err);
return cb(null, isMatch);
});
};
В этом случае я получаю следующее сообщение об ошибке:
Error: Can't set headers after they are sent.
Это означает перенаправление после успешного входа в систему. Если я использую verifyPassword без обратного вызова (режим синхронизации) он работает отлично:
User.verifyPassword = function verifyPassword(password, hash) {
return bcrypt.compareSync(password, hash);
};
Где ошибка в моем коде?