Node.js + MongoDB更新操作确认

在Node.js中,我有(简要)这个脚本:

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(); }); }); }); 

我正在使用一个名为xml-stream的Node.js包,它将来自Node的响应块拼凑在一起,以在处理之前获取有效的XML。 我的问题:如果我离开了

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

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

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

谢谢您的帮助。

看起来像所有updatecallback完成之前, 'end'事件正在发生。 所以你需要稍微修改一下你的代码来跟踪还在等待的更新数量,只要调用了'end'事件并且所有挂起的更新都完成了,就调用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; }); }); });