【发布时间】:2020-04-10 23:31:31
【问题描述】:
我创建了一个访问 AWS mongodb(版本:3.6)的 Nodejs API 服务器。 当我调用一个 api(比如 api/lowest)时,它给了我完美的结果,没有任何错误。但是当我几乎同时多次调用这个 API(15 个 API 调用)时,对于少数 API 调用(3-7)它给出了
MongoError: 未找到光标,光标 id xxxxx
API代码如下-
app.get('/lowest', async (req, res, next) => {
let url = 'mongodb://url';
let param1 = req.query.param1;
let param2 = req.query.param2;
let client = mongodb.MongoClient;
try {
client.connect(url, function (err, client) {
let db = client.db("db1");
let collection = db.collection('collection1');
let options = {
allowDiskUse: false,
timeout: false,
noCursorTimeout: true
};
// returns mongodb aggregation pipeline
let pipeline = helper.getLowestPipeline(param1, param2);
//Step 1: declare promise
let myPromise = () => {
return new Promise((resolve, reject) => {
collection.aggregate(pipeline, options).toArray(function (err, data) {
err
? reject(err)
: resolve(data);
});
});
};
//Step 2: async promise handler
let callMyPromise = async () => {
let result = await (myPromise());
client.close();
//anything here is executed after result is resolved
return result;
};
//Step 3: make the call
callMyPromise().then(function (result) {
res.send(JSON.stringify({"status": 200, "error": null, "response": result}));
});
});
} catch (e) {
client.close();
res.json({"status": 500, "error": e, "response": null});
res.end();
}
});
pm2监测结果如下:
MongoError:未找到游标,游标 ID:7820213409290816 在命名空间:db_name.collection_name
在连接处。 (/rc19_pricemongo/node_modules/mongodb/lib/core/connection/pool.js:466:61)
在 Connection.emit (events.js:210:5)
在 processMessage (/rc19_pricemongo/node_modules/mongodb/lib/core/connection/connection.js:364:10)
在 TLSSocket。 (/rc19_pricemongo/node_modules/mongodb/lib/core/connection/connection.js:533:15)
在 TLSSocket.emit (events.js:210:5)
在 addChunk (_stream_readable.js:309:12)
在 readableAddChunk (_stream_readable.js:290:11)
在 TLSSocket.Readable.push (_stream_readable.js:224:10)
在 TLSWrap.onStreamRead (internal/stream_base_commons.js:182:23) {
好的:0,
errmsg: '游标未找到,游标 id: 7820213409290816 在命名空间: db_name.collection_name',代码:43,
名称:'MongoError',
[Symbol(mongoErrorContextSymbol)]: { isGetMore: true }
我无法确定问题所在,任何建议都会有所帮助...
【问题讨论】:
-
您忘记从错误消息中删除
rc_price.rc_price_data。该错误表示在您尝试检索数据块时游标已经关闭。大多数 mongo 驱动程序函数可以返回 Promise 以避免回调地狱。您的 http 处理程序已经是异步的 - 尝试使用等待而不是回调来重写您的代码。此外,建议在应用程序启动时client.connect一次。驱动程序可以管理一个连接池 - 让它这样做stackoverflow.com/questions/10656574/… -
@AlexBlex:感谢您的建议,我关注了他们,现在可以正常工作了。
标签: node.js mongodb api cursor