Check mongoose connection state without creating new connection

Solution 1:

Since the mongoose module exports a singleton object, you don't have to connect in your test.js to check the state of the connection:

// test.js
require('./app.js'); // which executes 'mongoose.connect()'

var mongoose = require('mongoose');
console.log(mongoose.connection.readyState);

ready states being:

  • 0: disconnected
  • 1: connected
  • 2: connecting
  • 3: disconnecting

Solution 2:

I use this for my Express Server mongoDB status, where I use the express-healthcheck middleware

// Define server status
const mongoose = require('mongoose');
const serverStatus = () => {
  return { 
     state: 'up', 
     dbState: mongoose.STATES[mongoose.connection.readyState] 
  }
};
//  Plug into middleware.
api.use('/api/uptime', require('express-healthcheck')({
  healthy: serverStatus
}));

Gives this in a Postman request when the DB is connected.

{
  "state": "up",
  "dbState": "connected"
}

Gives this response when the database was shutdown.

{
"state": "up",
"dbState": "disconnected"
}

(The "up" in the responses represent my Express Server status)

Easy to read (no numbers to interpret)

Solution 3:

As stated before "readyState" is good. "ping" is also good admin utility for doing so as well. It will return { ok: 1 } if it can accept commands.

const mongoose = require('mongoose')

// From where ever your making your connection
const connection = await mongoose.createConnection(
    CONNECT_URI,
    CONNECT_OPTS
)

async function connectionIsUp(): Promise<boolean> {
    try {
        const adminUtil = connection.db.admin()

        const result = await adminUtil.ping()

        console.log('result: ', result) // { ok: 1 }
        return !!result?.ok === 1
    } catch(err) {
        return false
    }    
} 

Or if you you want it short.

async function connectionIsUp(): Promise<boolean> {
    try {
        return await connection.db.admin().ping().then(res => !!res?.ok === 1)
    } catch (err) {
        return false
    }
}