【发布时间】:2018-11-28 17:06:24
【问题描述】:
我正在使用光标在 NodeJS 中使用 mongodb 迭代 >30k 文档,并在此迭代期间在 processFn 中写入其他文档。
示例代码:
const cursor = collection
.find({}, { timeout: false })
.addCursorFlag('noCursorTimeout', true);
while (await cursor.hasNext()) {
const doc = await cursor.next();
await processFn({ id: doc._id.toHexString(), ...doc });
}
await cursor.close();
由于未知原因,我收到随机 CursorNotFound (43) 错误。
{ MongoError: cursor id 54902755976 not found
name: 'MongoError',
message: 'cursor id 54902755976 not found',
ok: 0,
errmsg: 'cursor id 54902755976 not found',
code: 43,
codeName: 'CursorNotFound' }
at /###/node_modules/mongodb-core/lib/connection/pool.js:593:63
at authenticateStragglers (/###/node_modules/mongodb-core/lib/connection/pool.js:516:16)
at Connection.messageHandler (/###/node_modules/mongodb-core/lib/connection/pool.js:552:5)
at emitMessageHandler (/###/node_modules/mongodb-core/lib/connection/connection.js:309:10)
at Socket.<anonymous> (/###/node_modules/mongodb-core/lib/connection/connection.js:452:17)
at Socket.emit (events.js:180:13)
at addChunk (_stream_readable.js:274:12)
at readableAddChunk (_stream_readable.js:261:11)
at Socket.Readable.push (_stream_readable.js:218:10)
at TCP.onread (net.js:581:20)
我已经检查过它们不是超时。它们总是在不到 5 分钟后发生。另外cursor.metrics 表示只有一个游标打开并且这个游标启用了noCursorTimeout。
我还检查了processFn 是否正确解析。
我阅读了有关会话和连接超时的信息,并将它们增加到极高的数量以进行测试。还是没有变化。
还有什么原因以及如何调试此错误?
【问题讨论】: