Я использую библиотеку паспорта для узла, чтобы помочь мне в регистрации пользователя. Я также использую библиотеку обещаний «Q», чтобы избежать пирамиды гибели, когда я проходил несколько асинхронных шагов.Nodejs Q обещание поймать никогда не вызывается с паспортом js
Все работает нормально, пока я не сделаю ошибку из одного из обещанных шагов. Я бы предположил, что выполнение будет зависеть от функции .fail
, где я мог бы обработать ошибку и вернуться из паспорта с неудачной регистрацией. Но по той причине, что я не понимаю, функция .fail
никогда не вызывается. Вместо этого я просто получаю stackdump в моем окне браузера и в моей консоли.
Контрольный код здесь:
q.fcall(checkEmailIsFree({'email':email, 'username':username, 'password':password}))
.then(checkUsernameIsFree)
.then(registerUser)
.then(function (user) {
if (user) {
logDebug('REGISTERED: ' + email);
return done(null, user);
}
else {
logDebug('Could not register');
return done(null, false);
}
})
.fail(function (err) {
logError('I never get here');
return done(null, false);
})
.done();
А вот как я выбрасываю, внутри checkEmailIsFree
var error = new Error('Bad times. Email is in use: ' + email);
throw error;
Есть некоторый общий код экспресса/узел где-то установлен на быстрый сброс как-то исключение? Почему мой улов не называется? Что мне не хватает?
Спасибо за ответ, но, увы, это не работает для меня. Стоит сказать: сервер не падает при ошибке, он просто печатает трассировку стека и затем простаивает. –
Ага, я понимаю, что если я не 'throw', а вместо' q.defer(). Reject() ', то вызывается предложение .done. Я могу работать с этим, но я все равно хотел бы понять механику вокруг 'throw' –
На самом деле я должен был упомянуть об этом. Вам нужно отказаться от обещания, чтобы он надлежащим образом справился с этим условием. –