2014-09-11 2 views
0

Je vérifie si une paire de valeurs de clé spécifique existe et insère si elles n'existent pas. Pour une raison étrange, MongoDB renvoie une erreur lors de l'insertion. Toute aide serait grandement appréciée.MongoDB lance "Erreur: la connexion a été détruite par l'application" pendant l'insertion

Mise à jour 2: Ajout de la fonction entière.

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

sortie

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

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

'col' est clairement défini en dehors de cette fonction et il n'est pas clair d'où cette fonction est appelée en termes de portée et qu'il n'y a pas en fait une déconnexion appelée n'importe où dans le code. Cela devrait en effet être appelé de l'intérieur de tout ce qui saisit l'objet 'col', et aussi sans aucune des autres actions mentionnées. –

+0

@NeilLunn Je viens de mettre à jour le code avec des variables globales. '' '' col'''' est l'une des variables globales. – harishvc

+1

Vous devez poster plus de code. Inclure où 'col' et' row' sont utilisés. –

Répondre

1

Désignons CB1 que le rappel de col.findOne, et CB2 que le rappel de col.insert.

CB1 retours une fois qu'il émet col.insert sans attendre CB2 pour terminer. Depuis cb1 également incrémenter i et votre fonction de test fournie à async.whilst serait alors évaluée comme étant fausse, ce qui cause le async.whilst pensé qu'il a fini toutes les itérations. Alors async.series passe à la tâche suivante, qui émet ensuite db.close. Par conséquent, la connexion à la base de données peut être fermée avant la fin des commandes d'insertion restantes. Par ailleurs, il semble que votre fragment de code bloquerait la base de données en émettant plusieurs fois col.findOne. Votre i augmente dans les deux CB1 ou CB2, mais les async.whilst peuvent à plusieurs reprises faire les tests et l'exécution de nombreuses fois avant chaque fois que i peut être augmentée. Peut-être que vous pourriez utiliser setTimeout(callback,...) au lieu d'appeler le rappel immédiatement.

Questions connexes