2014-09-11 41 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,...)而不是立即调用回调。