【问题标题】:How to handle the asynchronous transaction in NodejsNodejs如何处理异步事务
【发布时间】:2015-04-10 09:00:09
【问题描述】:

我的应用程序基于Nodejs + Mongodb + amqp。核心模块接收来自amqp的消息,然后将其包装到相应的消息事务中。在消息事务中,将消息信息保存到mongodb等一些逻辑中。

function messageReceiverCallback(msg) {
  try {
    messageHandler(decode(msg));
  } catch (ex) {
  } 
}

function messageHandler(msg) {
  function defaultTransaction() {
  }
  var dispatch = {
    'default': defaultTransaction
  }

  dispatch[MSG.TYPE1] = Msg1Transaction;
  // other message transaction here

  return (dispatch[msg.type] || dispatch['default'])(msg);
}

function Msg1Transaction(msg) {
   // some mongodb operation here...
}

但是,当amqp的队列中存在多条消息字段值不同的同类型消息时,则messageReceiverCallback会被调用,Msg1Transaction也会被调用多次。结果,mongodb 中保存的数据将不正确,因为我忽略了 mongodb 上的 异步 操作。 在这种情况下我该如何处理?

我有一个想法,可能会添加一个用Promise 包裹的新事务队列。所以事务可以异步处理。但是我不怎么执行呢?有人可以帮助我或其他更好的解决方案吗?

【问题讨论】:

    标签: javascript node.js mongodb asynchronous promise


    【解决方案1】:

    我不熟悉amqp,但如果我理解您的问题,您希望messageHandlermongo 操作完成时返回。在这种情况下,正确的逻辑是:

    function messageReceiverCallback(msg) {
       try {
         messageHandler(decode(msg));
        } catch (ex) { ... } 
    }
    
    function messageHandler(msg) {
       Msg1Transaction(msg, callbackAfterTransaction);
    }
    
    function callbackAfterTransaction(data){
       // update transaction info
    }
    
    function Msg1Transaction(msg, callback) {
     // some mongodb operation here...
     Collection.find ({}, 
        function(err, data)
        {
           ...
           callback(data);
        }
    }
    

    【讨论】:

    • 如果同时有三个Msg1,那么会创建三个Msg1Transaction。我想把这三个事务在链上异步处理,比如Promise(Msg1Transaction).then(Msg1Transaction).then(Msg1Transaction),怎么办?
    • 我不确定你是否掌握了异步的概念。因此,如果您想异步处理事件,那么您无法控制执行顺序。如果你想同步处理事件,那么你也可以使用一些第三方库来做到这一点(看看this question)。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2019-10-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多