我们正在使用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
块中,快递应用仍会崩溃。
我的目标是拥有Wes Bos's solution in this catchErrors
function的某些内容。我希望不必在MessageBus.publish
块中包含每个try/catch
调用,而是将该代码写入一个位置并在那里处理所有错误。