繁体   English   中英

将mongo更新包装在node.js中的函数中

[英]wrapping mongo update in function in node.js

将mongo查询/插入包装在函数中以使其可重用的正确方法是什么? 我有一个更新操作,可能会在各个地方进行,并且只想编写一次并重用它。 我正在使用MongoJS来连接w / 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()的方法是否被同步调用并阻塞,直到异步mongo更新完成?

  2. 如果它确实变得同步了,我希望不会对性能产生影响。 那我可以使用的方法是吗?

  3. 如果不是,那么正确的方法是什么?

mongoInsert()仍然是异步的,因为它正在调用异步函数( mongo.myt.update() )。 即使您不添加回调函数,它也不会神奇地变得同步。

您现在编写的方式是 mongoInsert() :在代码中的某个位置调用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);
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM