Promise.method()抛出未处理的拒绝 - 为什么?

时间:2015-10-14 13:43:04

标签: sequelize.js bluebird

我不明白为什么会得到

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('newpublisher@example.com').then(function (publisher) {
            should.exist(publisher);
            should.exist(publisher.email);
            publisher.email.should.eql('newpublisher@example.com');
            publisher.destroy();
            done();
        }).catch(HttpError, function (status) {
            should.not.exist(status);
            done();
        }).catch(done);
    });
});

因此,为了澄清,我知道为什么发布者不是未定义的。 我的问题指向蓝鸟部分。我希望将该方法用作承诺,并在此承诺上捕获HttpErrors。 难道这不能用Promise.method(...)吗? 你能解释一下吗?

1 个答案:

答案 0 :(得分:3)

问题是你没有在任何地方返回Promise,因此不会通过任何pi方法过滤分辨率和拒绝。您也不需要使用.then/catch,因为您已经在使用一个100%返回Promise的函数。

Promise.method