在Node.js中,当我需要时创build一个新对象吗?

所以,我不确定的是那个。 如果在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'); 

所以,当我运行主程序时,我想我会创build两个mongoose“实例”一个连接到pathA,一个连接到pathB,是吗?

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

谢谢。

我只是用最新的节点V0.4.6做了一些testing。 我确认了以下内容:

  1. 从“require”返回的variables是一个单例。
  2. 随后的更改将改变包含它的所有其他模块中所需模块的数据。
  3. mongoose的联系有点怪异。 即使断开连接并将其设置为新的连接path,它仍会使用旧的连接path。

所以,我的意思是上面的1和2是:

如果你有一个模块主

 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的testing脚本时,将它们实例化并输出:

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

您将得到以下输出:

 ABC MA ABC MA MB 

代替

 ABC MA ABC MB 

因此,这是一个单身人士。 不只是本地的模块。

我遇到这个post,虽然接受的答案显示它是一个单身人士,我对原始问题的回应“在Node.js中,我是否需要创build一个新的对象? 是“视情况而定”。

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; 

现在,如果你拿了上面的代码,你可能会发现,在许多情况下,没有修改你不会有单身问题。 IE与:

 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运算符(因为它本质上只是返回一个函数)。 IE与:

 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()); 

你会得到相同的输出。

再次,原来的问题有点宽泛(这个问题最终可能与mongoose有关(如Murvinlai的回答中的第3点所提到的),但是上面的例子是另一种做事的方式来产生一个实际的新对象closuresrequire()的每一个,现在你可能想要这样做,因为有时候你会想要Singleton(比如将caching的值存储在一个ORM / Mapper中),但是最后你要创build一个新的对象,这取决于..