2015-08-21 33 views
0

將函數中的mongo查詢/插入包裝成可重用的正確方法是什麼?我有一個更新操作可能發生在不同的地方,只想寫一次並重用它。我正在使用MongoJS來連接MongoDb API。在node.js中包裝mongo update函數

當我採取類似如下:

mongo.myt.update(
     {'_id': req._id}, 
     { 
      $addToSet: { 
       "aggregate.clientIds": req.myt.clientIds 
      }, 
      $inc: {"aggregate.seenCount": 1}, 
      $set: { 
       "headers": req.myt.headers, 
       "ip": req.myt.ip 
      }, 
      $setOnInsert: { 
       '_id': req.myt._id, 
       'derived': req.myt.derived 
      } 
     }, 
     {upsert: true}, 
     function (err, savedId) { 
      if (err || !savedId) console.log("failed to save :" + req.myt + " because of " + err); 
      else console.log("successfully saved :" + req.myt); 
     }); 

,並用以下簡單的函數把它包裝:

mongoInsert(req); 

我不」:

function mongoInsert(req) { 
    //same query as above 
} 

然後使用叫它在分析時不會看到對速度的任何影響。我是否應該向包裝函數添加回調,是否需要?我期待它會有一些性能影響,需要以不同的方式完成。

所以幾個問題。

  1. 上述調用mongoInsert()的方法是否會同步調用並阻塞,直到完成異步mongo更新?

  2. 如果它確實同步,我會期望我沒有看到的性能影響。那麼我採用的方法是否可以使用?

  3. 如果不是什麼將是正確的方法來做到這一點?

+0

你的做法是絕對的罰款。 – ZeMoon

回答

1

mongoInsert()仍然是異步的,因爲它調用異步函數(mongo.myt.update())。即使你不添加回調函數,它也不會神奇地變成同步的。

的方式你寫它現在是「發射後不管」:在某處你的代碼中調用mongoInsert(),你的代碼將繼續在更新正在發生跑,因爲你沒有傳遞迴調調用代碼無法獲知有關更新結果的信息(現在,您只需將結果記錄到控制檯)。

這是否是可以接受的設計決定。

你可以做回調可選的地方,你希望的情況下得到了解的更新結果:

function mongoInsert(req, callback) { 
    callback = callback || function() {}; // dummy callback when none is provided 
    mongo.myt.update(..., function(err, savedId) { 
    ...log status here... 
    callback(err, savedId); 
    }); 
} 
+0

感謝您的解釋! – Cyph