2013-10-23 89 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