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
}
}