MongoDB 驱动程序:MongoError:未找到游标,游标 ID:7820213409290816 在命名空间:db_name.collection_name

Posted

技术标签:

【中文标题】MongoDB 驱动程序:MongoError:未找到游标,游标 ID:7820213409290816 在命名空间:db_name.collection_name【英文标题】:MongoDB Driver : MongoError: Cursor Not found, cursor id: 7820213409290816 in namespace: db_name.collection_name 【发布时间】: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 一次。驱动程序可以管理一个连接池 - 让它这样做***.com/questions/10656574/… @AlexBlex:感谢您的建议,我关注了他们,现在可以正常工作了。 【参考方案1】:

我建议你使用find 方法,你可以将一个对象作为第二个参数传递给接收timeout 属性,它会防止光标超时。

IDModel.find(, timeout: false )

文档:http://mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#find

【讨论】:

以上是关于MongoDB 驱动程序:MongoError:未找到游标,游标 ID:7820213409290816 在命名空间:db_name.collection_name的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:处于无效状态的服务器实例未定义

MongoError - 身份验证错误(带@的密码)

MongoError - 身份验证错误(带@的密码)

MongoDB 通过 Mlab - MongoError:身份验证失败

MongoError:身份验证失败。 NestJs MongoDb 图集

MongoError:在 mongoDB atlas 中首次连接时无法连接服务