2015-08-21 4 views
0

Каков правильный способ обертывания запроса/вставки mongo в функцию, чтобы сделать его многоразовым? У меня есть операция обновления, которая может иметь место в разных местах и ​​хочет только написать ее один раз и повторно использовать. Я использую MongoJS для интерфейса с API MongoDb.wrapping mongo update in function in node.js

Когда я беру что-то вроде следующего:

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

И обернуть его простой функции, как:

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

Затем вызовите его с помощью:

mongoInsert(req); 

Я не» t видеть какое-либо влияние на скорость при профилировании. Должен ли я добавлять обратный вызов к функции обертки, это необходимо? Я ожидал, что это повлияет на производительность и должно быть сделано по-другому.

Итак, несколько вопросов.

  1. ли подход выше вызова mongoInsert) дозвонились (синхронно и блок, пока асинхронная Монго обновление не будет сделано?

  2. Если это становится синхронизацией, я бы ожидал влияния производительности, которое я не видел. Так подходит подход, который я использовал для использования?

  3. И если нет, то какой был бы правильный способ сделать это?

+0

Ваш подход абсолютно нормально. – ZeMoon

ответ

1

mongoInsert() еще асинхронный, потому что звонит асинхронную функцию (mongo.myt.update()). Даже если вы не добавите функцию обратного вызова, она не станет магически синхронной.

, как вы написали, что теперь «огонь и забыть»: где-то в вашем коде вы звоните mongoInsert(), ваш код будет продолжать работать в то время как обновление происходит, и так как вы не пропускать callback вызывающий код не может получить информацию о результате обновления (прямо сейчас вы просто регистрируете результат для консоли).

Это дизайнерское решение, приемлемо ли это.

Вы можете сделать обратный вызов необязательными для ситуаций, когда вы хотите получить информацию о результатах обновления:

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