[英]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);
配置文件时,我认为速度不会受到任何影响。 我应该在包装器函数中添加回调函数吗? 我期望它会对性能产生一定的影响,因此需要以不同的方式进行。
有几个问题。
上面调用mongoInsert()的方法是否被同步调用并阻塞,直到异步mongo更新完成?
如果它确实变得同步了,我希望不会对性能产生影响。 那我可以使用的方法是吗?
如果不是,那么正确的方法是什么?
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.