0

我们正在使用seneca.js将消息放入 Node 应用程序的队列中。我们承诺act调用,并将所有 seneca 使用包装在我们称为 MessageBus 的服务中。所以现在,MessageBus.publish 使用 Seneca 将调用放入队列并等待响应:

MessageBus.publish({ ... })
    .then(result => doSomething(result))
    .catch(error => handleError(error));

这是我们编写的服务的相关部分:

function MessageBus() {
    //initialization
    seneca.use('seneca-amqp-transport'); //instruct seneca to use a transport

    seneca.client({});
    seneca.listen({});

    const act = function(message, cb) {
        seneca.act(message, function(err, response) {
            if (err) {
                console.error(err);
                cb(err);
            } else {
                cb(null, response);
            }
        });
    };

    const promisified = Promise.promisify(act, { context: seneca });

    return {
        publish: promisified,
    };
}

module.exports = MessageBus();

在每次调用时,我们都需要添加catch来处理错误。这工作得很好,但有很多重复的代码。

现在,我们正在使用async/await,我想在一个地方处理所有错误,而不需要将每个调用都包装在一个try/catch块中。然而,我的尝试并没有奏效。

我添加的是一个调用该promisified函数并捕获错误的函数。然后publish改为导出该函数。它工作了一半,但在act功能中,cb没有定义。无论我尝试了什么,cb都从未被定义过,也从未被调用过。

我知道看起来错误是在 中处理的seneca.act,但是如果发生错误并且MessageBus.publish没有包装在try/catch块中,快速应用程序仍然会崩溃。

我的目标是在这个function中有一些与Wes Bos 的解决方案catchErrors类似的东西。我希望不必将每个MessageBus.publish调用都包装在一个try/catch块中,而是在一个地方编写该代码并在那里处理所有错误。

4

0 回答 0