25

所以,我不确定的是。如果在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 还是什么都没有?

谢谢。

4

2 回答 2

17

我刚刚用最新的节点 V0.4.6 做了几个测试。我确认了以下内容:

  1. “require”返回的变量是一个单例。
  2. 随后的更改将在包含它的所有其他模块中更改所需模块的数据。
  3. Mongoose 的连接有点奇怪。即使您断开连接并将其设置为新的连接路径,它仍然使用旧的连接路径。

因此,我所说的上述第 1 点和第 2 点的意思是:

如果您有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

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

于 2011-04-26T20:13:21.267 回答
3

我遇到了这篇文章,虽然接受的答案显示它是一个单例,但我对原始问题的回答是“在 Node.js 中,我是否在“需要”时创建了一个新对象?” 是“取决于”。

murvinlai 的答案/逻辑仍然适用于最新版本的 Node(在撰写本文时为 v0.10.18),但前提是您以这种方式设置了所需的文件。例如,如果您在 User.js 中有以下“用户”代码(结构与 murvinlai 的答案不同),我正在尝试使用更详细的示例来避免任何混淆

/**
 * User Model
 */
function modelUser() {
    var User  = {
        /**
         * User::_id
         *
         * @var integer
         */
        "_id" : null,

        /**
         * Set id
         *
         * @param integer id
         * @return User
         */
        "setId" : function(id)
        {
            User._id = id; 
            return User;
        },

        /**
         * Get id
         *
         * @return integer
         */
        "getId" : function()
        {
            return User._id;
        },

    }

    return User;

}
exports.modelUser = modelUser;

现在,如果您使用上面的代码,您可能会发现在许多情况下无需修改就不会遇到 Singleton 问题。即:

var user1 = require("./application/models/User.js").modelUser(); // In one module
var user2 = require("./application/models/User.js").modelUser(); // In another module

user1.setId(1);

console.log(user1.getId());
console.log(user2.getId());

你会得到 1,null。此外,我什至不确定你是否需要这个,但你可以在 require 上使用 new 运算符(因为它本质上只是返回一个函数)。即:

var user1 = new require("./application/models/User.js").modelUser(); // In one module
var user2 = new require("./application/models/User.js").modelUser(); // In another module

user1.setId(1);

console.log(user1.getId());
console.log(user2.getId());

你会得到相同的输出。

同样,最初的问题有点宽泛(问题可能最终与猫鼬有关(如 murvinlai 的回应中的#3 中所述),但以上是另一种处理方式以产生实际新对象的示例关闭每个 require()。现在您可能需要在执行此操作之前考虑一下,因为有时您需要 Singleton(例如将缓存值存储在 ORM/Mapper 中),但最后您是否创建了一个新的对象,这取决于..

于 2013-09-22T11:46:25.333 回答