Search code examples
node.jsrequiremongoose

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


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.


Solution

  • 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.