在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
});
});
});
}
答案 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;
}
}