簡體   English   中英

如何在Node.js中處理異步事務

[英]How to handle the asynchronous transaction in Nodejs

我的應用程序基於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包裝的新事務隊列。 因此,可以異步處理事務。 但是我不怎么執行呢? 能幫助我或其他更好的解決方案嗎?

我不熟悉amqp ,但如果我理解你的問題,你想要messageHandler來當回mongo操作完成。 在這種情況下,正確的邏輯是:

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM