Knows Not Much
Knows Not Much

Reputation: 31546

Mongoose connection events with createConnection

I moved away from using the default connection to a explicitly defined connection.

My code is working except that none of the event handlers which track the state of my mongo connection are firing.

the events used to fire when I was using default mongoose connection. (mongoose.connect).

var mongoose = require('mongoose'),
    logger = require('../logger'),
    config = require('../config');  

mongoose.connection.on('connecting', function(){
    logger.info("trying to establish a connection to mongo");
});

mongoose.connection.on('connected', function() {
    logger.info("connection established successfully");
});

mongoose.connection.on('error', function(err) {
    logger.error('connection to mongo failed ' + err);
});

mongoose.connection.on('disconnected', function() {
    logger.log('mongo db connection closed');
})

var gracefulExit = function() {
    db.close(function(){
        logger.log("mongoose connection with db " + server + 'is closing');
        process.exit(0);
    });
};

process.on('SIGNT', gracefulExit).on('SIGTERM', gracefulExit);

var db = mongoose.createConnection(config.get('DB_URL'));
module.exports = db;

the problem with the code is

  1. None of the event handlers are firing.
  2. Even the process events on SIGNT and SIGTERM are not firing.

I also tried

var db = mongoose.createConnection(config.get('DB_URL'));

db.on('connecting', function(){
    logger.info("trying to establish a connection to mongo");
});

but this also doesn't fire.

Upvotes: 10

Views: 19358

Answers (4)

ofir_aghai
ofir_aghai

Reputation: 3311

i also faced with this problem,
and finally i solved it, after understood that the connect() / createConnection() execute before i declare the event handlers. so the my open or connected events handlers will never called again.

so by declare them first and just after trying to connect - will solve your problem!

for example:

try {
  mongoose.connection
    .on('error', err => {
      console.error(err);
    })
    .on('open', err => {
      console.log(`DB connected`);
    })

  await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
} catch (error) {
  handleError(error);
}

Upvotes: 13

zachlyng
zachlyng

Reputation: 159

I just stumbled over this issue myself and found that I needed to set up the EventListeners before the actual connection to the database like so (with async/await):

export class Database {
  public static connect( databaseCredentials: string ) {
    return new Promise( async resolve => {
      // ! The `EventListeners` is setup here.
      mongoose.connection.on( "connected", () => {
        logger.info( "Database has connected successfully." );
      });
      mongoose.connection.on( "error", (error) => {
        logger.error( " Obs! There was an unexpected error connecting to the database.", error );
      });

      // ! The acutal connection to the database happens here.
      await mongoose.connect( databaseCredentials, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        keepAlive: true,
        reconnectInterval: 500,
        connectTimeoutMS: 10000,
      });

      resolve();
    });
  }
}

This should also work the same way with mongoose.createConnections.

This will yield the result (if successful):

{ message: 'Database has connected successfully.',
  level: 'info',
  timestamp: '2019-10-11T15:17:16.616Z' }

I just wanted to chip in and give my solution to the problem at hand and give a full example implementation of the code, as the above answers didn't explain in which order you needed to listen for the events. If you were to put the mongoose.connection.on() below the await.mongoose.connect(), this would not yield any response from the EventListeners.

Edit: Typos

Upvotes: 2

xx yy
xx yy

Reputation: 614

try:

mongoose.connection.on('open', function() {
    logger.info("database is ready now");
});

also temporary remove .close()

Upvotes: 1

R Rungsikavanich
R Rungsikavanich

Reputation: 173

This snippet blow work fine for me

const connection = mongoose.createConnection(`mongodb://${process.env.MONGO_URI}`);

connection.on('connected', () => {
  console.log('connected to mongodb');
});

connection.on('disconnected', () => {
  console.log('connection disconnected');
});

Upvotes: 7

Related Questions