I am trying to reuse MongoDB Connections in NodeJS. I am using Native MongoDB Driver v3.6.6. I have read and used the code from this question,this question and many others like it. My app.js is as follows:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');
var mongoCon=require('./modules/mongoCon');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var config=require('./config.json');
var app = express();
mongoCon.connectDb(function(db){
app.use(session({"secret": config["sessionSecret"]}));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
})
module.exports = app;
My mongoCon file is as follows:
const MongoClient = require( 'mongodb' ).MongoClient;
const mongoCredentials=require('./../config.json')["mongoCredentials"];
var url;
url = "mongodb://"+mongoCredentials["url"]+":"+mongoCredentials["port"];
var _db;
var client=new MongoClient(url,{ useNewUrlParser: true,useUnifiedTopology: true });
module.exports=
{
connectDb: async function(func=null){
await client.connect();
this._db = await client.db(mongoCredentials["db"]);
console.log("Database Connected");
if(func!=null){
func(this._db)
}
return this._db;
},
getDb: async function(func=null){
if(this._db){
if(func!=null){
func(this._db)
}
return this._db;
}
else{
await this.connectDb();
if(func!=null){
func(this._db)
}
return this._db;
}
}
}
When I want to reuse the connections I call MongoCon.getDb(). But this opens a new db Connection instead of reusing it. If I remove the check for __db in getDb(), it returns undefined. I am not sure how to solve this.