2015-08-25 2 views
0

Я использую библиотеку паспорта для узла, чтобы помочь мне в регистрации пользователя. Я также использую библиотеку обещаний «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; 

Есть некоторый общий код экспресса/узел где-то установлен на быстрый сброс как-то исключение? Почему мой улов не называется? Что мне не хватает?

ответ

1

Думаю, done(onFulfilled, onRejected, onProgress) может помочь в этом случае. Вы можете попробовать:

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); 
    } 
}) 
.done(undefined, function (err) { 
    logError('Error!'); // used in case of reject 
    return done(null, false); 
}); 
+0

Спасибо за ответ, но, увы, это не работает для меня. Стоит сказать: сервер не падает при ошибке, он просто печатает трассировку стека и затем простаивает. –

+1

Ага, я понимаю, что если я не 'throw', а вместо' q.defer(). Reject() ', то вызывается предложение .done. Я могу работать с этим, но я все равно хотел бы понять механику вокруг 'throw' –

+0

На самом деле я должен был упомянуть об этом. Вам нужно отказаться от обещания, чтобы он надлежащим образом справился с этим условием. –

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