In Node.js, am I creating a new object when "Require"?

murvinlai picture murvinlai · Apr 26, 2011 · Viewed 14.5k times · Source

So, what I'm not sure is that. if in ModuleA, I have:

var mongoose = require('mongoose');
mongoose.connect(pathA);

And in ModuleB, I have:

var mongoose = require('mongoose');
mongoose.connect(pathB);

And in the main program, I have:

var mA = require('./moduleA.js'), 
mB = require('./moduleB.js');

So, when I run the main program, I guess I will create two mongoose "instances"; one connecting to pathA and one connecting to pathB, is that right?

Also, in Module B, before I connect to pathB, is it connected to pathA or nothing?

Thanks.

Answer

murvinlai picture murvinlai · Apr 26, 2011

I just did a couple of tests with the latest node V0.4.6. I confirmed the following:

  1. The variable returned from "require" is a singleton.
  2. Subsequent changes will change the data of the required module among all other modules that include it.
  3. Mongoose's connection is a bit weird. Even if you disconnect and set it to a new connection path, it still uses the old connection path.

So, what I mean by the above points 1 and 2 is:

If you have a Module Master:

var myStr = 'ABC';
module.exports.appendStr = function(data) {
    myStr += ' ' + data;    
};
module.exports.output = function() {
    console.log("Output: " + myStr);
};

And if you have two other modules:

Module A

var mc = require('./moduleMaster.js');
var ma = function() {mc.appendStr(' MA '); };
ma.prototype.output = function() {
  mc.output();
}
module.exports.create = function() {
    return new ma();
};

module.exports._class = ma;

Module B

var mc = require('./moduleMaster.js');
var mb = function() {mc.appendStr(' MB '); };
ma.prototype.output = function() {
  mc.output();
}
module.exports.create = function() {
    return new mb();
};

module.exports._class = mb;

Now when you run a test script that requires both Module A and Module B, instantiate them and output:

mTestA.output();
mTestB.output();

You will get the following output:

ABC MA
ABC MA MB

instead of

ABC MA
ABC MB

Therefore, it is a singleton. not just local to the module.