MongoDB抛出"错误:连接被应用程序"在插入期间

时间:2014-09-11 05:39:05

标签: node.js 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 个答案:

答案 0 :(得分:1)

cb1 表示为col.findOne的回调,将 cb2 表示为col.insert的回调。

cb1 在发出col.insert而不等待 cb2 完成后返回。由于 cb1 也会增加 i ,因此提供给async.whilst的测试函数会被评估为false,这会导致async.whilst认为它已经完成所有迭代。 因此async.series转到下一个任务,然后发出db.close。因此,可以在剩余的插入命令完成之前关闭数据库连接。

顺便说一句,您的代码段似乎会通过重复发出col.findOne来阻塞数据库。 cb1 cb2 中的 i 会增加,但async.whilst可能会在每次重复执行多次测试和执行之前 i 可以递增。也许您可以使用setTimeout(callback,...)而不是立即调用回调。