I using Node-Mongo-Native and trying to set a global connection variable, but I am confused between two possible solutions. Can you guys help me out with which one would be the good one? 1. Solution ( which is bad because every request will try to create a new connection.)
var express = require('express');
var app = express();
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
// Connection URL
var url = '[connectionString]]';
// start server on port 3000
app.listen(3000, '0.0.0.0', function() {
// print a message when the server starts listening
console.log("server starting");
});
// Use connect method to connect to the server when the page is requested
app.get('/', function(request, response) {
MongoClient.connect(url, function(err, db) {
assert.equal(null, err);
db.listCollections({}).toArray(function(err, collections) {
assert.equal(null, err);
collections.forEach(function(collection) {
console.log(collection);
});
db.close();
})
response.send('Connected - see console for a list of available collections');
});
});
Solution ( to connect at app init and assign the connection string to a global variable). but I believe assigning connection string to a global variable is a not a good idea.
var mongodb;
var url = '[connectionString]';
MongoClient.connect(url, function(err, db) {
assert.equal(null, err);
mongodb=db;
}
);
I want to create a connection at the app initialization and use throughout the app lifetime.
Can you guys help me out? Thanks.
Create a Connection
class to manage the apps database connection.
MongoClient does not provide a singleton connection pool so you don't want to call MongoClient.connect()
repeatedly in your app. A singleton class to wrap the mongo client works for most apps I've seen.
const MongoClient = require('mongodb').MongoClient
class Connection {
static async open() {
if (this.db) return this.db
this.db = await MongoClient.connect(this.url, this.options)
return this.db
}
}
Connection.db = null
Connection.url = 'mongodb://127.0.0.1:27017/test_db'
Connection.options = {
bufferMaxEntries: 0,
reconnectTries: 5000,
useNewUrlParser: true,
useUnifiedTopology: true,
}
module.exports = { Connection }
Everywhere you require('./Connection')
, the Connection.connectToMongo()
method will be available, as will the Connection.db
property if it has been initialised.
const router = require('express').Router()
const { Connection } = require('../lib/Connection.js')
// This should go in the app/server setup, and waited for.
Connection.connectToMongo()
router.get('/files', async (req, res) => {
try {
const files = Connection.db.collection('files').find({})
res.json({ files: files })
}
catch (err) {
res.status(500).json({ error: err })
}
})
module.exports = router