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

后端 未结 2 1755
隐瞒了意图╮
隐瞒了意图╮ 2020-12-24 14:11

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

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

And

2条回答
  •  一向
    一向 (楼主)
    2020-12-24 14:29

    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.

提交回复
热议问题