在node.js中的函数中包装mongo update

时间:2015-08-21 06:16:03

标签: javascript node.js mongodb

什么是在函数中包装mongo查询/插入以使其可重用的正确方法?我有一个更新操作,可能发生在各个地方,只想写一次并重用它。我使用MongoJS与MongoDb API进行交互。

当我采取以下内容时:

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

在分析时我没有看到对速度的任何影响。我是否应该在包装函数中添加回调,是否需要?我期待它会产生一些性能影响,需要以不同的方式完成。

所以有几个问题。

  1. 调用mongoInsert()的方法是否会被同步调用并阻塞,直到async mongo更新完成为止?

  2. 如果确实变得同步,我会发现性能影响我没看到。我采用的方法是否可以使用?

  3. 如果不是这样做的正确方法是什么?

1 个答案:

答案 0 :(得分: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);
  });
}