Como conectar MongoDB en NestJS con mongoose

Hola a todos, hoy os voy a explicar como podemos conectar MongoDB en NestJS usando mongoose.

Mongoose es un ODM (Object-Document Mapping) que nos permite mapear los objetos que creemos con NestJS y que se refleje en MongoDB.

Sino sabes como crear un proyecto en NestJS, te dejo un pequeño tutorial donde lo explico:

Como crear un proyecto con NestJS

Necesitamos instalar las siguientes dependencias:

$ npm install --save @nestjs/mongoose mongoose

Necesitamos tener instalado. Sino lo tienes aqui te dejo como instalarlo:

Como instalar MongoDB en Windows

Para que sea más cómodo de reutilizar, vamos a crear un módulo. Aquí te explico cómo:

Crear un módulo en NestJS

En este caso, solo tendremos el módulo en sí y un servicio, el controlador no es necesario.

Se quedaría así:

También vamos a hacer que el servicio se exporte.

Ahora, en nuestro servicio vamos a tener como atributo la conexión de la base de datos.


import { Injectable } from '@nestjs/common';
import { Connection } from 'mongoose';

@Injectable()
export class MongoConnectionService {
    private dbConnection: Connection;
}

Crearemos un método llamado createConnection() donde crearemos la conexión. En el constructor, lo llamarermos.

Como es un servicio y utiliza el patrón Singleton solo se creará la conexión una vez.

import { Injectable } from '@nestjs/common';
import { Connection } from 'mongoose';

@Injectable()
export class MongoConnectionService {

    private dbConnection: Connection;

    constructor(){
        this.createConnectionDB();
    }

    createConnectionDB(){

    }
    
}

La cadena de conexión de MongoDB , el formato es así:

mongodb://usuario:password@host:port/database?authSource=admin

Explicamos cada parte:

  • usuario: usuario de MongoDB, si queremos conectarnos de forma anónima no será necesario ponerlo.
  • password: password de MongoDB, si queremos conectarnos de forma anónima no será necesario ponerlo.
  • host: host donde conectarnos
  • port: puerto de escucha de MongoDB, por defecto 27017.
  • database: base de datos de MongoDB.

Por ejemplo:

mongodb://admin:123456@localhost:27017/example?authSource=admin

Para crear usuarios en MongoDB, tenemos un tutorial sobre ello:

Como crear un usuario administrador en MongoDB

Si quieres darle más seguridad a MongoDB (opcional), tenemos un tutorial sobre ello:

Como habilitar seguridad de MongoDB en Windows

Para crear la conexión, usaremos la función createConnection de mongoose (importándola) pasándole la cadena de conexión. Esta función devuelve la conexión que guardaremos en el atributo que hemos comentado antes.

Esta conexión le indicamos un par de eventos:

  • open: saltará cuando haya una conexión con la base de datos.
  • error: saltará en caso de error de conexión con la base de datos.

import { Injectable } from '@nestjs/common';
import { Connection, createConnection } from 'mongoose';

@Injectable()
export class MongoConnectionService {

    private dbConnection: Connection;

    constructor(){
        this.createConnectionDB();
    }

    async createConnectionDB(){

        const DB_URI = 'mongodb://admin:123456@localhost:27017/example?authSource=admin';
        
        this.dbConnection = await createConnection(DB_URI);

        this.dbConnection.once('open', () => {
            console.log('Connected to MongoDB');
        })

        this.dbConnection.once('error', () => {
            console.log('Error connecting to MongoDB');
        })

    }

}


Por último, debemos tener una función para devolver la conexión.


import { Injectable } from '@nestjs/common';
import { Connection, createConnection } from 'mongoose';

@Injectable()
export class MongoConnectionService {

    private dbConnection: Connection;

    constructor(){
        this.createConnectionDB();
    }

    async createConnectionDB(){

        const DB_URI = 'mongodb://admin:123456@localhost:27017/example?authSource=admin';
        
        this.dbConnection = await createConnection(DB_URI);

        this.dbConnection.once('open', () => {
            console.log('Connected to MongoDB');
        })

        this.dbConnection.once('error', () => {
            console.log('Error connecting to MongoDB');
        })

    }
    
    getConnection(): Connection{
        return this.dbConnection;
    }

}

Recuerda de en este caso, el modulo de conexión lo vamos a importar en app.module.

La idea es que cuando tengamos otros módulos, lo importemos en esos módulos y en app.module lo quitemos.

Si arrancamos veremos el mensaje de que se ha conectado correctamente.

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.