Node.js:模块系统,对象引用

Node.js:模块系统,对象引用,node.js,Node.js,现在,如果我将其包括为: // connections.js ... module.exports = { conn: { mongodb: { connect: function() {throw ...}, disconnect: function() {throw ...}, getState: function() {throw...} }, mysql: {

现在,如果我将其包括为:

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

为什么第一个失败了?
db
var应该包含对
connections.conn.mongodb
的引用?至少,我希望两者都能起作用,或者不起作用。让第一个失败,第二个成功的区别是什么?感谢您

在第一种情况下,它失败了,因为在不同的范围内调用了setup(),并且在调用setup时db/conn.mongodb发生了分歧(写入时有一个副本)。如果在exports.foo函数中比较db和conn.mongodb,应该会看到conn.mongodb已经用
setupMongo
进行了初始化,而db仍然有未初始化的版本。不确定调用connections.setup的代码是什么样子的,但从外观上看,db!==康涅狄格州蒙哥德

是的,db==康涅狄格,就像你说的。我试图理解:“setup()是在另一个作用域中调用的,而db/conn.mongodb在调用setup时发生了分歧(写入时有一个副本)”。如果其中一个是对另一个的引用,那么它们如何发散?
// 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
}