mongoose试图打开未closures的连接(callback地狱)

我想添加一个循环到数据库logging。 但mongoose写道,我没有closures打开的连接。 mongoose试图打开未closures的连接。 如何使整个事情同步? 它的callback在我的代码中

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

您实际上不需要在每个请求上打开/closures连接(有关详细信息,请参阅此处 )。

相反,您可以在应用程序启动时打开一次连接,然后在应用程序closures时closures连接。

如果打开连接,则可以重复使用连接,而不必在每次调用该函数时浪费时间/资源来build立新的连接。

在我看来,你正试图创build另一个连接而不closures当前的连接。 所以,你可能想要使用:

createConnection()而不是connect()

在你的情况下,它看起来像这样:

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

我今天得到了同样的错误,我发现的解决scheme是,我们不应该在循环或代码中的任何地方一次又一次地执行mongoose.connect函数。

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

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

你的代码有点类似,因为在循环中你正在调用函数,并在函数中打开连接。

谢谢