PATRON DE SINGLETON NODEJS CON MONGOOSE

 Uso del Patrón Singleton en Node.js con Mongoose




El patrón Singleton es un patrón de diseño creacional que garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. En el contexto de Node.js y Mongoose, este patrón es especialmente útil para gestionar la conexión a la base de datos de MongoDB, asegurando que no se creen múltiples conexiones accidentales, lo que podría afectar el rendimiento y la estabilidad de la aplicación.

¿Por qué usar Singleton en Mongoose?

  • Rendimiento: Abrir varias conexiones a la base de datos puede sobrecargar tanto la aplicación como el servidor de MongoDB. El patrón Singleton permite reutilizar una única conexión, mejorando el rendimiento.

  • Seguridad: Tener un control centralizado sobre la conexión a la base de datos garantiza que no se generen conexiones innecesarias que podrían provocar vulnerabilidades o puntos débiles.

Implementando el Patrón Singleton para la Conexión a MongoDB

A continuación, te muestro cómo podemos implementar el patrón Singleton para la conexión a MongoDB usando Mongoose:

Importaciones y Configuración Inicial


import mongoose from 'mongoose';
import dotenv from 'dotenv';

// Cargar las variables de entorno desde el archivo .env
dotenv.config();

// URL de conexión de MongoDB (obtenida desde las variables de entorno)
const url = process.env.MONGODB_URI;
const atlas = process.env.MONGODB_ATLAS;

  • Importar mongoose, la biblioteca que facilita la conexión a MongoDB y la interacción con la base de datos.
  • dotenv se utiliza para cargar las variables de entorno desde el archivo .env. Esto permite que la URL de conexión sea segura.
  • Se almacenan las URLs de conexión a la base de datos en variables. Estas URLs son obtenidas desde las variables de entorno, MONGODB_URI para utilizar la base de datos local o MONGODB_ATLAS para la base de datos en Atlas (MongoDB en la nube).
  • Clase MongoConnection

    class MongoConnection {
      constructor() {
        this.connection = null; // Propiedad para almacenar la conexión
      }

    • Constructor: Inicializa la clase con la propiedad connection, que inicialmente es null. Esta propiedad será utilizada para almacenar la conexión a la base de datos y evitar que se creen múltiples conexiones.

    Método connectToLocal()

    async connectToLocal() {
        if (this.connection) {
          console.log('Ya existe una conexión a MongoDB local.');
          return this.connection;
        }

        try {
          this.connection = await mongoose.connect(url);
          console.log('Conexión exitosa a MongoDB local');
          return this.connection;
        } catch (error) {
          console.error('Error al conectar a MongoDB local:', error);
          throw error; // Re-lanza el error para que pueda ser manejado en otro lugar si es necesario
        }
      }

  • Verificación de conexión: Si ya existe una conexión (this.connection no es null), se reutiliza la conexión existente y se devuelve.
  • Conexión a la base de datos: Si no hay una conexión activa, el método intenta conectar a la base de datos local usando mongoose.connect(url).
  • Manejo de errores: Si ocurre un error durante la conexión, se captura y se muestra en la consola, además de lanzarse nuevamente el error para manejarlo desde fuera de la clase.
  • Método connectToAtlas():

    async connectToAtlas() {
        if (this.connection) {
          console.log('Ya existe una conexión a MongoDB Atlas.');
          return this.connection;
        }

        try {
          this.connection = await mongoose.connect(atlas);
          console.log('Conexión exitosa a MongoDB Atlas');
          return this.connection;
        } catch (error) {
          console.error('Error al conectar a MongoDB Atlas:', error);
          throw error; // Re-lanza el error para que pueda ser manejado en otro lugar si es necesario
        }
      }
    }

    • Funciona igual que el método connectToLocal(), pero conecta a MongoDB Atlas. La lógica es similar: si ya existe una conexión, se reutiliza, y si no, se establece una nueva conexión con Atlas.

    Instancia Única (Singleton)

    // Crear una instancia única (Singleton)
    const mongoInstance = new MongoConnection();

    export default mongoInstance;

    • Aquí se crea una única instancia de la clase MongoConnection, llamada mongoInstance. Esta instancia será la que se use en toda la aplicación, asegurando que solo haya una conexión única y global a la base de datos.

    Beneficios de Usar Singleton

    Eficiencia: Evita la creación de múltiples conexiones, lo que reduce la carga de tu aplicación y mejora el uso de recursos.
    Fácil Mantenimiento: Centralizar la lógica de la conexión a la base de datos simplifica el mantenimiento del código, especialmente en proyectos grandes.
    Mejor Rendimiento: Al mantener una única conexión activa, se optimiza el manejo de los recursos del servidor y se mejora la latencia.

    Recuerden que este código es una buena implementación del patrón Singleton en Node.js y Mongoose,
    optimizando tanto la conexión local como la conexión a MongoDB Atlas.

    Comentarios