2014-03-18 59 views
4

我想添加一個循環到數據庫記錄。但貓鼬寫道,我沒有關閉開放的連接。貓鼬試圖打開未關閉的連接。如何使整個事情同步?其回調地獄在我的代碼Mongoose試圖打開未關閉的連接(回調地獄)

app.get("/dobavit/", function(req, res) { 
     for(var i=50; i>0; i--) 
    { 
        InsertAXIXA("analitika",i,function(data){ 
       }); 
    } 
     res.end(); 
    }); 

    function InsertAXIXA(qwerty,page,callback){ 
     mongoose.connect('mongodb://localhost/gazprom') 
     var parsedResults = []; 

     var req = request('http://xxx.ru/'+qwerty+"?page="+page, function (error, response, html) { 
      if (!error && response.statusCode == 200) { 
       // str = iconv.decode(html, 'utf-8'); 
       var $ = cheerio.load(html); 
       $('.col-1 .col-first').each(function(i, element){ 
        var buf = $(this); 
        var zagolovok = buf.children(0).children().children().eq(0).text(); 
        var previewText = buf.children(2).children().eq(0).text(); 
        var url = buf.children(0).children().children().eq(0).attr('href'); 
        var picUrl = buf.children(1).children().eq(0).children().children().eq(0).attr('src'); 


        var metadata = { 
         zagolovok:zagolovok, 
         previewText:previewText, 
         url:url, 
         typeOfnews:qwerty, 
         picUrl:picUrl, 
         qwerty:qwerty 
        }; 
        var news =new News({ 
         zagolovok: zagolovok, 
         previewText: previewText, 
         url:url, 
         picUrl:picUrl, 
         qwerty:qwerty 
         // created_at:Date.today() 

        }); 
        news.save(function(err, news,affected){ 
        }); 
        parsedResults.push(metadata); 
       }); 
       callback(parsedResults); 

      } 
      mongoose.connection.close() 
     }); 

回答

4

你不應該真正需要打開/關閉在每次請求(參見here更多有關)的連接。

相反,您可以在應用程序啓動時打開一次連接,然後在應用程序關閉時關閉連接。

如果將連接保持打開狀態,則可以重複使用連接,而不必在每次調用該函數時浪費時間/資源建立新連接。

2

在我看來,你正試圖創建另一個連接而不關閉當前的連接。因此,您可能想要使用:

createConnection()而不是connect()

在你的情況下,它應該是這樣的:

db = mongoose.createConnection('mongodb://localhost/mydb'); 
0

今天,我居然也得到了同樣的錯誤,我發現是解決方案,我們不應該叫環路的mongoose.connect功能或代碼中的任何地方都會被一次又一次地執行。

所以我的例子是,我正在做所有的應用程序的請求mongoose.connect。

app.all("*",function(){ 
    mongoose.connect(); 
}) 

您的代碼有點類似於因爲在循環中您正在調用函數並在函數中打開連接。

謝謝