Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

554
Views
MongoError: la topología está cerrada, conéctese (problema client.close y client.connect)

(nodo: 21140) UnhandledPromiseRejectionAdvertencia: MongoError: la topología está cerrada, conéctese

Creo que es un error relacionado con la repetición de client.connect y client.close en cada función de la operación CRUD como se muestra en el código a continuación

//Creo que no hay problema con el clúster uri, así que no lo publiqué porque se conecta bien

 const MongoClient = require("mongodb").MongoClient; const uri = "mongodb+srv://username:pasword@some cluster"; //I think there is no issue with cluster uri so I didn't post that since it connects fine const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); async function AddnewService(service) { await client.connect() const database = client.db("twitch") const usr = await database.collection("recipes").find({ Title: service.Title }).toArray() if (usr.length >= 1) { await client.close() return { message: "Title already in use" } } else { const result = await database.collection("recipes").insertOne(service) await client.close() return { message: "Service Added to Database" } } } async function FetchAllserviceSearch(service) { await client.connect() const database = client.db("twitch") let recipesCursor = await database.collection("recipes").find({}) while (await recipesCursor.hasNext()) { //make sure to put await on cursor .hasnext() let recipe = await recipesCursor.next() console.log(recipe) } await client.close() return { message: "User Added to Database" } } module.exports = { AddnewService, FetchAllserviceSearch }

Traté de hacer que client.connect y client.close se llamaran solo una vez, pero siempre ha habido un nuevo error causado por eso. No puedo eliminar module.export porque los necesito para usarlos en otro archivo.

Así que necesito un poco de ayuda para que funcione de alguna manera sin esa repetición innecesaria, ya que mongodbAtlas causa problemas con eso.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

No cierre su conexión DB, está en condiciones de carrera, cuando lleguen dos solicitudes, una se cerrará y la otra se abrirá.

 client.close(); -----> remove

Utilice la misma conexión de base de datos para todas las solicitudes.

 const uri = "mongodb+srv://username:pasword@cluster0.ik1pu.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"; let con; async function connect(service) { if (con) return con; // return connection if already conncted const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); con = client.connect() return con; } async function AddnewService(service) { const client = await connect(); const database = client.db("twitch") const usr = await database.collection("recipes").find({ Title: service.Title }).toArray() if (usr.length >= 1) { // await client.close(); -----> remove return { message: "Title already in use" } } else { const result = await database.collection("recipes").insertOne(service) return { message: "Service Added to Database" } } } async function FetchAllserviceSearch(service) { const client = await connect(); const database = client.db("twitch") let recipesCursor = await database.collection("recipes").find({}) while (await recipesCursor.hasNext()) { //make sure to put await on cursor .hasnext() let recipe = await recipesCursor.next() console.log(recipe) } // await client.close(); -----> remove return { message: "User Added to Database" } } module.exports = { AddnewService, FetchAllserviceSearch }
over 4 years ago · Santiago Trujillo Report

0

Está intentando cerrar el cliente en un controlador de solicitudes, pero su cliente es global.

Si desea tener un cliente global, no lo cierre en los controladores de solicitudes.

Si desea cerrar el cliente en los controladores de solicitudes, cree el cliente en el controlador de la misma solicitud.

Cree una clase de conexión para administrar la conexión de la base de datos de aplicaciones. MongoClient no proporciona un grupo de conexiones singleton, por lo que no desea llamar a MongoClient.connect() repetidamente en su aplicación. Una clase singleton para envolver el cliente mongo funciona para la mayoría de las aplicaciones que he visto.

 const MongoClient = require('mongodb').MongoClient class Connection { static async open() { if (this.db) return this.db this.db = await MongoClient.connect(this.url, this.options) return this.db } } Connection.db = null Connection.url = 'mongodb://127.0.0.1:27017/test_db' Connection.options = { bufferMaxEntries: 0, reconnectTries: 5000, useNewUrlParser: true, useUnifiedTopology: true, } module.exports = { Connection }

Dondequiera que require('./Connection' ), el método Connection.connectToMongo() estará disponible, al igual que la propiedad Connection.db si se ha inicializado.

 const { Connection } = require('../lib/Connection.js') async function AddnewService(service) { // This should go in the app/server setup, and waited for. await Connection.connectToMongo() const database = Connection.db("twitch") const usr = await database.collection("recipes").find({ Title: service.Title }).toArray() if (usr.length >= 1) { // await client.close() return { message: "Title already in use" } } else { const result = await database.collection("recipes").insertOne(service) // await client.close() return { message: "Service Added to Database" } } }

En express puedes hacer algo como esto,

 import {MongoClient} from 'mongodb'; import express from 'express'; import bodyParser from 'body-parser'; let mongoClient = null; MongoClient.connect(config.mongoURL, {useNewUrlParser: true, useUnifiedTopology: true},function (err, client) { if(err) { console.log('Mongo connection error'); } else { console.log('Connected to mongo DB'); mongoClient = client; } }) let app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use((req,res,next)=>{ req.db = mongoClient.db('customer_support'); next(); });

Y use en su solicitud identificadores como este,

 router.post('/hello',async (req,res,next)=>{ let uname = req.body.username; let userDetails = await AddnewService(req.db,uname) // change signature of this method res.statusCode = 200; res.data = userDetails; next(); });
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!