use global variable to share db between module

mongodb, node.js

Solution

I typically include a project utilities file that contains a number of these things, just to make it easy. It functions as a pseudo global, but without many of the usual problems globals entail.

For example,

projectUtils.js

module.exports = {

  initialize: function(next){
    // initialization actions, there can be many of these
    this.initializeDB(next);
  },

  initializeDb: function(next){
    mongoClient.open(function(err, mongoClient) {
      if(err) return next(err);
      module.exports.db = mongoClient.db(DB);
      next();
    });
  }
}

app.js

var projectUtils = require('projectUtils');

// (snip)
projectUtils.initialize(function(err) {
  if(err) throw err; // bad DB initialization
  // After this point and inside any of your routes,
  // projectUtils.db is available for use.
  app.listen(port);
}

By using an asynchronous initialize() function, you can be sure that all database connections, file I/O, etc., are done before starting up the server.

Problem

I am working on a nodejs / mongodb app using 'mongodb' module. The app is launched with ``` node main.js ``` In main.js, I connect to the db and keep the connection in the 'db' global variable. 'db' is then used in inner methods of 'server'. I want to avoid having 'db' as a global variable but did not found the correct way to do. My current main.js: ``` var server = require('./lib/server'); var MongoClient = require('mongodb').MongoClient; var Server = require('mongodb').Server; var mongoClient = new MongoClient(new Server(HOST, PORT)); db = null; // Database connection mongoClient.open(function(err, mongoClient) { if(!err){ // Database selection db = mongoClient.db(DB); // Launch web server server.start(); // usage of 'db' in this part } else { console.log(err.message); process.exit(1); } }); ``` Any idea of a cleaner way ? UPDATE I finally created a module in connection.js: ``` var config = require('../config/config'); var url = 'mongodb://' + config.db.host + ':' + config.db.port + '/' + config.db.name; var MongoClient = require('mongodb').MongoClient; var db = null; module.exports = function(cb){ if(db){ cb(db); return; } MongoClient.connect(url, function(err, conn) { if(err){ console.log(err.message); throw new Error(err); } else { db = conn; cb(db); } }); } ``` Each time I need to get the connection I call: ``` var connection = require('./connection'); connection(function(db){ // doing some stuff with the db }); ``` This is working very well. Any potential failure with this approach ?

Original source