Tengo el siguiente método para conectarme a MongoDB:
import { Db, MongoClient } from 'mongodb'; let cachedConnection: { client: MongoClient; db: Db } | null = null; export async function connectToDatabase(mongoUri?: string, database?: string) { if (!mongoUri) { throw new Error( 'Please define the MONGO_URI environment variable inside .env.local' ); } if (!database) { throw new Error( 'Please define the DATABASE environment variable inside .env.local' ); } if (cachedConnection) return cachedConnection; cachedConnection = await MongoClient.connect(mongoUri, { useNewUrlParser: true, useUnifiedTopology: true, }).then((client) => ({ client, db: client.db(database), })); return cachedConnection!; }
Y lo uso de la siguiente manera:
const { db, client } = await connectToDatabase( config.URI, config.USERS_DATABASE ); const user = await db .collection(config.USERS_COLLECTION) .findOne({ _id: new ObjectId(userId) });
Parece estar bien, pero no lo está. El problema de este método es que no cierra las conexiones. Por ejemplo, tengo un clúster en Atlas, y las conexiones siguen creciendo hasta 500. Después de eso, ya no sirve, entra en tiempo de espera y luego mi backend falla.
Para resolver esto, probé con client.close()
justo antes de devolver la respuesta a la interfaz.
Me arroja un error que dice MongoError: Topology is closed, please connect
. ¿Creo que cierra la conexión antes de que termine? ¿Es correcto? Incluso si lo pongo después de que respondiera el DB.
esta es la captura de pantalla del error:
¿Crees que hay una manera de resolver esto o simplemente tengo que hacer todo el procedimiento en cada archivo que necesito para conectarme a mongo? ¿Tú también crees que hice algo mal?