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

475
Visualizações
Serverless express close mongodb connexion

Estoy usando serverless en aws con nodejs y mongodb atlas como base de datos

Actualmente estoy usando la versión de prueba que permite un máximo de 500 conexiones.

Parece que mi código no desconecta la base de datos cuando finaliza el proceso

Estoy usando express para administrarlo.

Primero, no tenía una conexión cerrada pensando que la conexión se cerrará automáticamente una vez que finalice el proceso, pero no, tenía muchas conexiones abiertas.

Luego agregué un middleware para cerrar mis conexiones después de enviar la respuesta, no estaba funcionando, estaba pensando que serverless estaba deteniendo el proceso una vez que se envió la respuesta.

No en cada ruta estoy cerrando la conexión mongo, por ejemplo

 router.get('/website/:id/page', async (req, res, next) => { try { const pages = await pageDataProvider.findByWebsite(req.params.id); await mongodbDataProvider.close(); res.json(pages); } catch (error) { next(error) } })

Así es como manejo las conexiones con mongo

 const MongoClient = require('mongodb').MongoClient const config = require('../config') const MONGODB_URI = config.stage === 'test' ? global.__MONGO_URI__ : `mongodb+srv://${config.mongodb.username}:${config.mongodb.password}@${config.mongodb.host}/admin?retryWrites=true&w=majority`; const client = new MongoClient(MONGODB_URI); let cachedDb = null; module.exports.connect = async () => { if (cachedDb) return cachedDb; await client.connect(); const dbName = config.stage === 'test' ? global.__MONGO_DB_NAME__ : config.stage; const db = client.db(dbName) cachedDb = db; return db; } module.exports.close = async () => { if (!cachedDb) return; await client.close(); cachedDb = null; }

No entiendo porque tengo tantas conexiones abiertas

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Paso 1

Aísle la llamada a la función MongoClient.connect() en su propio módulo para que las conexiones se puedan reutilizar entre funciones. Vamos a crear un archivo mongo-client.js para eso:

mongo-cliente.js :

 const { MongoClient } = require('mongodb'); // Export a module-scoped MongoClient promise. By doing this in a separate // module, the client can be shared across functions. const client = new MongoClient(process.env.MONGODB_URI); module.exports = client.connect();

Paso 2

Importe el nuevo módulo y utilícelo en los controladores de funciones para conectarse a la base de datos.

algún-archivo.js :

 const clientPromise = require('./mongodb-client'); // Handler module.exports.handler = async function(event, context) { // Get the MongoClient by calling await on the connection promise. Because // this is a promise, it will only resolve once. const client = await clientPromise; // Use the connection to return the name of the connected database for example. return client.db().databaseName; }
over 4 years ago · Santiago Trujillo Relatório

0

Creo que es un error programático en su método de cierre. Por favor, eche un vistazo más de cerca

si (!cachedDb) regresa;

Creo que debería haber sido

if (cachedDb != null) return;

Como se indicó en otra respuesta, recomendaría encarecidamente no cerrar las conexiones de base de datos con cada solicitud. Debería buscar un mecanismo de grupo, donde una conexión del grupo se entregue a su aplicación. La aplicación puede esperar hasta que reciba la conexión.

El cierre de las conexiones de la base de datos debe manejarse en el momento en que la aplicación se está cerrando (cerrando/cerrando). De esta manera, la aplicación al menos intentará cerrar las conexiones correctamente.

No obstante, aquí hay una adaptación de su programa.

índice.js

 const express = require('express') const app = express() const port = 3000 const dbProvider = require('./dbProvider'); dbProvider.connect(); app.get('/testConnection',async (req, res, next) => { console.log('Doing something for fetching the request & closing connection'); dbProvider.close(); console.log('After closing the connection'); }) app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) })

dbProvider.js

 let cachedDb = null; let db = {}; module.exports.connect = async () => { if (cachedDb) { console.log('Returning Cachedb'); return cachedDb; } else{ console.log('Not a cachedDB'); } db.setup = 1; return db; } module.exports.close = async () => { if (!cachedDb) { console.log('Since its cached DB not closing the connection'); return; } db=null; return; }

Y aquí está la salida de la consola:

 -> node index.js Not a cachedDB Example app listening at http://localhost:3000 Doing something for fetching the request & closing connection Since its cached DB not closing the connection After closing the connection
over 4 years ago · Santiago Trujillo Relatório

0

Según esto: https://docs.atlas.mongodb.com/best-practices-connecting-from-aws-lambda/

Es una buena idea agregar esta línea para mantener su conjunto de conexiones entre solicitudes. context.callbackWaitsForEmptyEventLoop = false;

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