猫鼬试图打开未关闭的连接(回调地狱)

时间:2014-03-18 20:08:50

标签: node.js mongoose

我想在数据库记录中添加一个循环。但是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()
        });

3 个答案:

答案 0 :(得分:4)

您实际上不应该在每次请求时打开/关闭您的连接(有关详细信息,请参阅here。)

相反,您可以在应用启动时打开一次连接,然后在应用关闭时关闭它。

如果保持连接处于打开状态,则可以重复使用连接,而不是每次调用该函数时都浪费时间/资源来建立新连接。

答案 1 :(得分:2)

在我看来,您正在尝试创建另一个连接而不关闭当前连接。所以,您可能想要使用:

createConnection()代替connect()

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

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

答案 2 :(得分:0)

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

所以我的例子是,我在app的所有请求上都在做mongoose.connect。

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

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

由于