2012-12-18 31 views
2

在Node.js的,我有(简述)这个脚本:的Node.js + MongoDB的更新操作确认

var http = require('http'); 
var XmlStream = require('xml-stream'); 
var mongo = require('mongodb'); 

var tims = { ... }; 

var db = new mongo.Db('tims', new mongo.Server("127.0.0.1", 27017, {}), {w: 1}); 
db.open(function(e, db) { 
    var req = http.get({ 
     host: tims.uri, 
     path: '/xml/'+tims.database+tims.services.database 
    }).on('response', function(res) { 
     res.setEncoding('utf8'); 
     cProjects = db.collection("projects"); 
     var xml = new XmlStream(res); 

     xml.on('updateElement: Tims ProjectID', function(project) { 
      // console.log(project.$text+' - '+project.$.title); 
      cProjects.update({project_id: project.$text}, {project_id: project.$text, title: project.$.title}, {upsert:true}, function(err, result) { 
       console.log('result: '+result); 
      });  
     }); 

     xml.on('end', function(data) { 
      db.close(); 
     }); 

    }); 
}); 

我使用的是Node.js的包叫做xml-stream是拼凑从节点响应块获得处理前有效的XML。我的问题:如果我离开了

xml.on('end', function(data) { 
    db.close(); 
}); 

我的连接从不关闭,控制台挂起。好处是,console.log('result: '+result);写入控制台,我可以看到我的数据成功提交。因此,如果我在end事件中离开,并且在处理完所有XML后关闭数据库,则在编写console.log('result: '+result)之前终止节点实例。

我是MongoDB和Node.js的新手,所以我很好奇最好的做法是在这里进行确认,或者可能是一个简单的指出我做错了什么。

感谢您的帮助。

回答

1

看起来像'end'事件发生在所有update回调已完成之前。因此,您需要稍微修改一下代码以跟踪更新仍在等待的数量,只有0123'事件触发并且所有挂起的更新都完成后才会调用db.close()

因此,像这样:

db.open(function(e, db) { 
    var req = http.get({ 
     host: tims.uri, 
     path: '/xml/'+tims.database+tims.services.database 
    }).on('response', function(res) { 
     res.setEncoding('utf8'); 
     cProjects = db.collection("projects"); 
     var xml = new XmlStream(res); 
     var end = false; 
     var pending = 0; 

     xml.on('updateElement: Tims ProjectID', function(project) { 
      // console.log(project.$text+' - '+project.$.title); 
      ++pending; 
      cProjects.update({project_id: project.$text}, {project_id: project.$text, title: project.$.title}, {upsert:true}, function(err, result) { 
       console.log('result: '+result); 
       if (--pending === 0 && end) { 
        db.close(); 
       } 
      });  
     }); 

     xml.on('end', function(data) { 
      end = true; 
     }); 

    }); 
}); 
+0

我等不及去办公室,并尝试了这一点! –