2012-12-18 86 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

我等不及去辦公室,並嘗試了這一點! –