一尘不染

在Node.js中,是否在“需要”时创建一个新对象?

node.js

所以,我不确定那是什么。如果在 ModuleA中 ,我有:

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

ModuleB中 ,我有:

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

在主程序中,我有:

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

因此,当我运行主程序时,我想我将创建两个猫鼬“实例”;一个连接到pathA,一个连接到pathB,对吗?

另外,在模块B中,在我连接到pathB之前,它是连接到pathA还是什么都没有?

谢谢。


阅读 282

收藏
2020-07-07

共1个答案

一尘不染

我刚刚对最新的节点V0.4.6做了一些测试。我确认了以下内容:

  1. 从“需要”返回的变量是单例。
  2. 随后的更改将更改所需模块以及包含它的所有其他模块中的数据。
  3. 猫鼬的联系有点奇怪。即使断开连接并将其设置为新的连接路径,它仍会使用旧的连接路径。

因此,以上第一点和第二点的意思是:

如果您有 Module Master

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

并且如果您还有其他两个模块:

模块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;

模块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;

现在,当您运行需要模块A和模块B的测试脚本时,请实例化它们并输出:

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

您将获得以下输出:

ABC MA
ABC MA MB

代替

ABC MA
ABC MB

因此,它是一个单例。不仅限于模块本地。

2020-07-07