2014-02-12 2 views
1

Я пытаюсь реализовать локальную аутентификацию с помощью 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); 
}; 

Где ошибка в моем коде?

ответ

0

Вы, вероятно, нужно добавить еще заявление для последнего вызова сделано(), как показано в этом фрагменте:

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); 
    }); 
} 
else { 
    // Added an ELSE statement here 
    return done(err, false); 
} 

Без этого еще заявлении призыв к exports.User.verifyPassword() будет И вызов для возврата (err, false) ... и затем, в конце концов, второй вызов done() будет выполнен, когда verifyPassword() вызывает обратный вызов, который вы ему дали.

Второй вызов done() - это то, что, вероятно, создает заголовки, была установлена ​​ошибка.

Смежные вопросы