Actualizar mi aplicación alojada en Vercel al nuevo controlador MongoDB (4.0) ha introducido errores esporádicos como este:
MongoServerError: Cursor session id ([session hash])is not the same as the operation context's session id (none)
He jugado con el script de conexión y almacenamiento en caché de MongoDB según lo recomendado por Vercel/Next https://github.com/vercel/next.js/blob/canary/examples/with-mongodb/lib/mongodb.js pero el problema continúa.
No estoy lo suficientemente claro sobre cuáles son los cambios en el nuevo controlador que podrían estar introduciendo esto, pero se solucionó volviendo a 3.6.10.
El problema parece ocurrir cuando se realiza una solicitud más de 30 segundos después de una consulta idéntica de la misma función de Node.js.
Mi código de conexión db:
import { MongoClient } from "mongodb"; let uri = process.env.MONGODB_URI; let dbName = process.env.MONGODB_DB; let cached = global.mongo; if (!cached) { cached = global.mongo = { conn: null, promise: null }; } export async function connectToDatabase() { if (cached.conn) { return cached.conn; } if (!cached.promise) { const opts = { useNewUrlParser: true, useUnifiedTopology: true, }; cached.promise = MongoClient.connect(uri, opts).then((client) => { return { client, db: client.db(dbName), }; }); } cached.conn = await cached.promise; return cached.conn; }Editar: este error en el controlador v4 Node.js se corrigió en 4.2.1
Tengo el mismo error cuando uso collection.find() con una gran colección, y desaparece después de cambiarlo a collection.find().limit(100) , solo para su referencia.
También enfrentamos este error recientemente y otra posible solución que nos ayudó es pasar explícitamente la sesión a la consulta. También está escrito en el ticket correspondiente . Por ejemplo, si usa .find , entonces puede tener algo como esto:
const session = mongoClient.startSession(); try { const query = await collection.find({}, { session }); } finally { await session.endSession(); }