簡體   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