2014-09-11 42 views
0

我檢查是否存在特定的鍵值對,如果它們不存在則插入。出於某種奇怪的原因,MongoDB在插入過程中拋出一個錯誤。任何幫助將不勝感激。MongoDB在插入過程中拋出「錯誤:連接被應用程序破壞」

更新#2:增加了整個功能。

{ 
    var connectURL = "mongodb://something"; 
    var mycollection= "something2"; 
    var db; 
    var col; 

    async.series([ 
     // Connect to DB 
     function(callback) { 
       MongoClient.connect(connectURL,function(error, db2) { 
         if (error) {console.log("db connect error" + error);callback(error,"db connect error"); return;} 
         db = db2; 
         callback(null,"connect success"); 
       }); 
     }, 
     function(callback) { 
       col = db.collection(mycollection); 
      callback(null,"collection success"); 
     }, 
     function(callback) { 
       //console.log ("insert begin ...");      
       var i = 1; 
       async.whilst(
       function() { return i <= count }, 
       function(callback) { 
        var mydocument = rows.shift();  
        col.findOne({ "sha" : mydocument.sha}, function(err, doc) { 
         console.log ("checked ....", mydocument.sha); 
         if(doc != null) { 
         console.log ("Exist :" + mydocument.sha); 
         } else { 
         console.log ("Inserting : " + mydocument.sha);  
         col.insert(mydocument,function(error,result) { 
         if (error) { 
         console.log("insert error:" + error); 
         callback(error); 
         return; 
         } 
         i++; 
         console.log ("inserted ..."); 
         }); //end insert 
        } //end else 
      i++; 
      });//end findOne 
      callback(null); 
     }, 
       function(error) { 
        callback(error,"insert sucess") 
       } 
      ); //end async.whilst 
     }, 
     function (callback){ 
       //console.log ("###########close db"); 
       db.close(); 
       console.log("## end insert: "+ moment().format()); 
       callback(null,"connection closed"); 
     } 
    ], function(error, results) { 
        if (error) { console.log("error"); } 
          //console.log(results); 
      });  
} 

輸出

checked .... 078d40cc537de96310e945a50a60b0084e21d2e1 
Inserting : 078d40cc537de96310e945a50a60b0084e21d2e1 
insert error:Error: Connection was destroyed by application 

TypeError: Cannot read property 'sha' of undefined 
+1

'col'明確地定義在這個函數之外,它不清楚這個函數在範圍方面被調用的地方,而且實際上並沒有在代碼中的任何地方調用斷開連接。這確實應該從抓住「col」對象的內部調用,並且也不涉及任何其他提及的行爲。 – 2014-09-11 05:50:02

+0

@NeilLunn我剛剛用全局變量更新了代碼。 ''''col''''是全局變量之一。 – harishvc 2014-09-11 06:57:33

+1

您需要發表更多的代碼。包括使用「col」和「row」的位置。 – 2014-09-11 07:01:39

回答

1

表示CB1作爲col.findOne回調,和CB2作爲col.insert回調。

CB1返回一旦發出col.insert無需等待CB2結束。由於cb1也會增加i並且您提供給async.whilst的測試功能將評估爲false,這會導致async.whilst認爲它已完成所有迭代。 因此async.series移動到下一個任務,然後發出db.close。因此,在剩餘的插入命令完成之前,數據庫連接可能會關閉。

順便說一句,看起來你的代碼片斷會通過反覆發出col.findOne來堵塞數據庫。你增加或者CB1CB2,但async.whilst每次可以增加之前可能會反覆做測試,並執行許多許多倍。也許你可以使用setTimeout(callback,...)而不是立即調用回調。