Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

use global variable to share db between module

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 ?

like image 744
Luc Avatar asked Aug 01 '13 21:08

Luc


People also ask

How do I share global variables across modules?

The best way to share global variables across modules across a single program is to create a config module. Just import the config module in all modules of your application; the module then becomes available as a global name.

How global variables are accessed from module?

A global can be accessed by any function , but it can only be modified if you explicitly declare it with the 'global' keyword inside the function. To use global variables inside a function, you need to do global < varName > inside the function.

What is declaration of global variable across Python modules?

A global variable in Python is often declared as the top of the program. In other words, variables that are declared outside of a function are known as global variables. You can access global variables in Python both inside and outside the function.


2 Answers

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.

like image 100
ssafejava Avatar answered Oct 07 '22 23:10

ssafejava


You can create a wrapper something like a provider and put it in provider.js, for instance.

Provider = function (db_name, host, port, username, password) {
    var that = this;
    var conn = generate_url(db_name, host, port, username, password); // you need to implement your version of generate_url()

    MongoClient.connect(conn, function (err, db) {
        if (err) {
            throw err;
        }
        that.db = db;
    });
};

//add the data access functions
Provider.prototype.getCollection = function (collectionName, callback) {
    this.db.collection(collectionName, collectionOptions, callback);
};

exports.Provider = Provider;

This is how you use the provider:

var db = new Provider(db_name, host, port, username, password);
db.getCollection('collection name', callback);
like image 23
zs2020 Avatar answered Oct 07 '22 22:10

zs2020