【问题标题】:MongoError: connection destroyed, not possible to instantiate cursorMongoError:连接被破坏,无法实例化光标
【发布时间】:2018-01-21 08:31:48
【问题描述】:

在 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)

为了让事情变得更复杂,我并不总是在运行相同的代码时得到它。

在网上搜索后,我了解到它是在尝试从数据库中读取 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
      });
    });
  });
}

【问题讨论】:

  • 发布您的代码以了解如何检索
  • 我刚刚编辑了帖子并添加了相关代码。
  • 这些天我遇到了同样的问题。深入查看您的代码并找到关闭数据库连接的位置db.close()。 Javascript 不是从上到下运行的。相反,您可以认为整个代码同时运行。你可以看看this问题。我用它来解决我的问题,它奏效了。
  • 你知道我刚开始遇到这个问题。我查看了我的 db.close() 在哪里,我意识到是的,在我调用 .close() 时,一些回调可能还没有完成。延迟 1 秒(粗略),现在它可以工作了。

标签: mongodb heroku parse-server


【解决方案1】:

您需要确保在光标完全清空后调用 close()。您可以通过确保使用 async/await 或 promises 来做到这一点,.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
  }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 2019-06-28
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 2015-07-09
      • 2020-10-23
      • 2016-12-27
      相关资源
      最近更新 更多