gpt4 book ai didi

javascript - Nodejs 异步更新插入问题

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:24 25 4
gpt4 key购买 nike

我目前正在开发一个使用 MongoDB 的 Nodejs 项目,并密切监视 Nodejs 服务器的数据流。

我的 Node 服务器的代码如下:

Receive.js
1. Node 服务器接收JSON文本文件
2. Node 服务器告诉MongoDB(更新插入)我们收到了一个文件

Process.js
3. Node 服务器将JSON文件更新插入MongoDB
4. Node 服务器告诉 MongoDB 我们处理了该文件。

问题是有时#4出现在#2之前,尽管#1总是出现在#3之前。我的监控程序开始显示处理的文件多于接收的文件。有没有办法解决这个问题而不使该服务器完全同步?

例如,如果我向 Node 服务器发送 500 个 JSON 文本文件,则 Node 最后一次执行 #2 的时间应该早于最后一次执行 #4 的时间。

** 注意:App.js调用.接收来自 Receive.jsReceive.jsProcess.js 调用 .save **

app.js

http.createServer(app).listen(app.get('port'), function(){
mongodb.createConnection(function(db){
if(db){
console.log('success connecting to mongodb!');
}
});
});
app.post('/log', logCollection.receive);

--
Receive.js

exports.receive = function(req, res, next){
var usagelog = req.body.log;

if(!usagelog){
log4js.logger.error("Usagelog is Null!");
res.end("fail");
}else{
count++;

//Upsert the Receive Count for Monitor
mongodb.getConnection(function(db){

dateFormat.initDate();
//Upsert trip (usage logs)
var currentDateTime = moment().format('YYYY-MM-DD hh:mm:ss');
db.collection("ReceiveCount").update( {"date":dateFormat.currentDate(), "pid":process.pid },
{"date":dateFormat.currentDate(), "IPAddress": ip.address(), "pid":process.pid, "countReceive" : count, "LastReceivedTime": currentDateTime},
{upsert:true}, function(err, result) {
});
});

//End Receive count
var usagelogJSON = convertToJson(usagelog);
var usagelogWithCurrentDate = addUpdateTime(usagelogJSON);
usagelogDao.save(usagelogWithCurrentDate, res);
}
};

--

Process.js

exports.save = function(usagelog, res){
var selector = upsertCondition(usagelog);

mongodb.getConnection(function(db){
//Upsert trip (usage logs)
db.collection(collectionName()).update(selector, usagelog, {upsert:true, fullResult:true}, function(err, result) {
if(err){
log4js.logger.error(err);
res.end("fail");
}else{

if(result.nModified == 0)
countInsert++;
else
countUpdate++;

//Upsert Processed Count (both Updated and Inserted
db.collection("ReceiveCount").find({"date":dateFormat.currentDate(), "pid":process.pid },{}).toArray(function (err, docs) {

var receivecount = docs[0].countReceive;
var receivetime = docs[0].LastReceivedTime;
var currentDateTime = moment().format('YYYY-MM-DD hh:mm:ss');
var MongoCount=0;

db.collection("raw_"+dateFormat.currentDate()).count(function(err, count){
console.log("raw_"+dateFormat.currentDate());

MongoCount = count;
console.log("Mongo count is :" +MongoCount);
});

db.collection("ReceiveCount").update( {"date":dateFormat.currentDate(), "pid":process.pid },
{"date":dateFormat.currentDate(), "IPAddress": ip.address(), "pid":process.pid, "countUpdate" : countUpdate, "countInsert":countInsert, "countTotal":countUpdate+countInsert, "LastProcessTime": currentDateTime,
"countReceive":receivecount, "LastReceivedTime":receivetime, "MongoCount":MongoCount}, {upsert:true}, function(err, result) {
});
});
res.end("success");
}
});
});
};

最佳答案

您可以使用异步模块 ( https://github.com/caolan/async )。这是伪代码:

async.parallel([
fun1(cb) {
tellDBYouReceivedFile(..., onFinished() {
cb();
});
},
fun2(cb) {
saveYourFileToDB(..., onFinished() {
cb();
});
},
], function() {
tellDBYouProcessedFile();
});

您想要实现的目标无法完全异步完成,因为最后一步(#4)必须先等待#2 和#3 完成。上面的例子可以让#2和#3异步,并保证#4最后执行。

关于javascript - Nodejs 异步更新插入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com