我们正在使用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
块中,而是在一个地方编写该代码并在那里处理所有错误。