Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

551
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda