MongoError:连接被破坏,无法实例化游标

时间:2017-08-13 08:44:58

标签: mongodb heroku parse-server

在Heroku上运行应用程序时,使用带有mLab的Parse-Server,我在日志中收到以下错误:

app[web.1]: /app/node_modules/parse-server/lib/ParseServer.js:481
app[web.1]:             throw err;
app[web.1]:             ^
app[web.1]: MongoError: connection destroyed, not possible to instantiate cursor
app[web.1]:     at nextFunction (/app/node_modules/mongodb-core/lib/cursor.js:607:55)
app[web.1]:     at Cursor.next [as _next] (/app/node_modules/mongodb-core/lib/cursor.js:692:3)
app[web.1]:     at fetchDocs (/app/node_modules/mongodb/lib/cursor.js:856:10)

为了使事情变得更复杂,我不会一直得到它,而相同的代码正在运行。

在网上搜索后,我发现在尝试从数据库中读取超过100条记录时会发生这种情况。 这似乎与我所观察到的一致。

不幸的是,我没有在网上找到任何解决问题的方法。 因此我的问题是:我该如何处理这个问题?

有没有办法将阈值从100提高到更高值? 还是其他任何处理这个问题的好方法?

如果这对于执行该作业的函数的代码可能有用。 在大多数情况下,它就像魅力一样。 当提供的typKey碰巧匹配太多记录时,我得到上面提到的问题。

function get_List(displayPage, db, response) {
  db.collection('TheCollection', function (err, collection) {
    collection.find({"typeKey": "TYPE01"}).toArray(function(err, items) {
      if(err) throw err;

      response.render('pages/displayList.ejs', {
        dataArray: items
      });
    });
  });
}

2 个答案:

答案 0 :(得分:0)

您需要确保在光标完全清空后调用close()。您可以通过确保使用async / await或promises .then()来做到这一点,以便在关闭mongo集合之前有机会将响应完全写出

延迟输入以确保光标已完全完成,这非常粗糙,很可能会给您带来奇怪的错误。

如果您有权访问异步/等待,请使get_list()函数异步,并确保在关闭连接之前等待其响应。否则,将其包装在Promise中,并仅在解决诺言后关闭连接。例如

function get_List(displayPage, db, response) {
  db.collection('TheCollection', function (err, collection) {
    collection.find({"typeKey": "TYPE01"}).toArray(function(err, items) {
      if(err) throw err;

      response.render('pages/displayList.ejs', {
        dataArray: items
      });
    });
  });
}

async function whichCallsget_List(request response) => {
  try {
    var client = await MongoClient.connect(
                        mongourl,
                       { useNewUrlParser: true }
                 )
    const db = await client.db(process.env.DB_NAME)

    await get_List('displayPage', db, response)
    db.close();
  } catch (reason) {
    // error handling
  }
}

答案 1 :(得分:0)

例如-在我的情况下-我在返回前已关闭连接

var readByCondition = function (connectionString, dbName, collectionName, condition, params, callback) {
    try {
        var db = mongo.db(connectionString + dbName, {
            native_parser: false
        });

        db.bind(collectionName);

        db.collection(collectionName).find(condition, params).toArray(function (err, result) {
            if (err) {
                db.close();
                return callback(err, result);
            }
            db.close();
            return callback(err, result);

        });

    } catch (err) {
        throw err;

    }
}