2015-10-14 1 views
0

Я не понимаю, почему я получаюPromise.method() выбрасывает необработанное отклонение - почему?

Unhandled rejection HttpError 
    at null.<anonymous> (/home/makolb/devel/n4v_newsletter/app/controls/publishercontrol.js:31:23) 
    at tryCatcher (/home/makolb/devel/n4v_newsletter/node_modules/sequelize/node_modules/bluebird/js/main/util.js:26:23) [...] 

, который строку с броском новой HttpError (409); в моем коде:

var PublisherControl = { 
    newPublisher: Promise.method(function (email, req) { 
     models.Publisher.findOne({where: {email: email}}).then(function (publisher) { 
      if (publisher !== undefined) { 
       throw new HttpError(409); 
      } 
     }).then(function() { 
      var password = Password.generate(12); 
      models.Publisher.create({email: email, password: Password.hashPassword(password)}).then(function (publisher) { 
       i_need_this_then_because_i_do_here_something(); 
       how_do_i_return_a_promise_if_return_publisher_is_not_enough(); 
       return publisher; 
      }); 
     }).catch(function (err) { 
      if (!(err instanceof HttpError)) { 
       console.error('catched error: ' + err); 
       throw new HttpError(500); 
      } else { 
       throw err; 
      } 
     }); 
    }) 
}; 

Мой мокко тест выглядит следующим образом:

describe.only('#newPublisher', function() { 
    it('should create new publisher', function (done) { 
     var Control = require('../../../app/controls/publishercontrol'); 
     Control.newPublisher('[email protected]').then(function (publisher) { 
      should.exist(publisher); 
      should.exist(publisher.email); 
      publisher.email.should.eql('[email protected]'); 
      publisher.destroy(); 
      done(); 
     }).catch(HttpError, function (status) { 
      should.not.exist(status); 
      done(); 
     }).catch(done); 
    }); 
}); 

Так уточнить, я знаю, почему издатель не определено. Мой вопрос указывает на часть синей птицы. Я хотел бы использовать этот метод в качестве обещания и поймать HttpErrors на этом обещании. Не должно ли это работать с Promise.method (...)? Можете ли вы это объяснить?

ответ

3

Проблема в том, что вы ничего не возвращаете в любом месте, поэтому разрешения и отклонения не фильтруются через любые методы .then/catch. Вам также не нужно использовать Promise.method, так как вы уже работаете с функцией, которая возвращает Promises в 100% случаев.

var PublisherControl = { 
    newPublisher: function (email, req) { 
    return models.Publisher.findOne({where: {email: email}}) 
    .then(function (publisher) { 
     if (publisher !== undefined) { 
     throw new HttpError(409); 
     } 
    }) 
    .then(function() { 
     var password = Password.generate(12); 
     return models.Publisher.create({ 
     email: email, 
     password: Password.hashPassword(password) 
     }) 
    }) 
    .catch(function (err) { 
     if (!(err instanceof HttpError)) { 
     console.error('catched error: ' + err); 
     throw new HttpError(500); 
     } 

     throw err; 
    }); 
    } 
}; 
+0

Ok. Я обновил свой код выше ... Это имеет смысл, что вы говорите. Но как мне вернуть обещание, если я буду использовать его уже с помощью ... create(). Then (...) - могу ли я вернуть тогда как обещание? – Markus

+0

Вы можете мутировать 'издателя', однако вы хотите в этой функции, а затем вернуть его. Он был удален в моем примере, поскольку он выглядел как функция идентификации, которая ничего не делала, однако ее можно повторно добавить, если вам нужно продолжить обработку «издателя» после создания. – dherman