2013-10-23 38 views
0
// connections.js 
... 
module.exports = { 
    conn: { 
     mongodb: { 
      connect: function() {throw ...}, 
      disconnect: function() {throw ...}, 
      getState: function() {throw...} 
     }, 
     mysql: { 
      connect: function() {throw ...}, 
      disconnect: function() {throw ...}, 
      getState: function() {throw ...} 
     } 
    }, 
    drivers: { 
     mongoose: mongoose, 
     mysql: mysql 
    }, 
    states: connectionStates, 

    setup: function(config, cb) { 
     // provides concrete implementations of connect(), discconnect(), 
     // getState(), sets up listeners to relay connection events 
     this.conn.mongodb = setupMongo(config.mongodb); 
     this.conn.mysql = setupSql(config.mysql); 
     ... 
     cb(); 
    } 
}; 

现在,如果我有这样的:的Node.js:模块系统,对象引用

// main.js 

var connections = require(__dirname + '/connections'), 
    conn = connections.conn, 
    db = conn.mongodb; 

// connectionections.setup() not been called yet 
exports.foo = function() { 
    // connections.setup() already been called before this point 
    db.connect(...);   // fails - error thrown - using the abstract function 
    conn.mongodb.connect(...); // works 
} 

为什么第一个失败? db var应该包含对connections.conn.mongodb的引用?至少,我希望既可以工作也可以不工作。有什么区别可以让第一个失败,第二个成功?谢谢

回答

1

它在第一种情况下失败,因为在不同的作用域中调用setup(),并且在调用安装程序时db/conn.mongodb发生分歧(写入时发生拷贝)。如果在exports.foo函数中比较db和conn.mongodb,则应该看到conn.mongodb已使用setupMongo进行初始化,并且db仍具有未初始化的版本。不知道代码的外观是什么调用connections.setup,但从这看起来,db!=== conn.mongodb。

+0

是的,db!== conn.mongodb正如你所说。我试图理解:“setup()在不同的作用域中调用,db/conn.mongodb在安装程序调用时发生分歧(写入时有副本)”。如果一个是对另一个的引用,它们是如何分歧的? – Colin