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

Mic*_*hel 5 heroku mongodb parse-server

在Heroku上运行应用程序时,将Parse-Server与mLab一起使用,我在日志中收到以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

为了使事情变得更加复杂,在运行相同代码的同时,我不会一直都这样。

在网上搜索后,我发现尝试从数据库中读取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
      });
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*och 0

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

放置延迟以确保光标已完全完成是非常粗鲁的,并且可能会给您带来奇怪的错误。

如果您有权访问 async/await,请将 get_list() 函数设置为异步,并确保在关闭连接之前等待它的响应。否则,将其包装在 Promise 中,并且仅在 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
  }
}
Run Code Online (Sandbox Code Playgroud)