我使用mongoose
和sessions
在我们的nodejs
+express
后端执行ACID事务。
最近,我需要向我们的一个工作人员(由RabbitMQ支持)发送一个消息来进行post transaction操作。我不能在提交后直接将消息发送给我们的worker,因为它背后有一个复杂的工作流,完成事务并不总是意味着必须调用代码。
我认为我需要使用事件发射器来注册.once('onCommit', ...)
事件,并在事务完成时调用emit('onCommit')
。但这是手动方法。
我想知道mongoose
中是否有开箱即用的支持,可以使用mongoose.ClientSession
进行后事务操作。我看到mongoose会话本身是事件侦听器,但我找不到任何相关文档。我猜会话事件是内部使用的。
谁能开导我一下?谢谢
您应该能够使用ended
事件。因此,如果使用session.endSession();
session.on('ended', () => 'post transaction operation');
另外,如果您需要有关事务提交或中止的信息。您可以获取会话后的数据并检查事务状态,如下所示:
session.on('ended', (postSession) => {
const state = postSession.transaction.state;
if (state === 'TRANSACTION_COMMITTED') {
'successful transaction operation';
}
if (state === 'TRANSACTION_ABORTED') {
'aborted transaction operation';
}
});