// 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();
}
};
现在,如果我将其包括为:
// 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
?至少,我希望两者都有效,或者不工作。允许第一个失败和第二个成功有什么区别?谢谢
在第一种情况下它失败了,因为setup()在不同的范围内被调用,并且db/conn.mongodb在调用安装程序时发散(写入时有副本)。 如果在 exports.foo 函数中比较 db 和 conn.mongodb,您应该会看到 conn.mongodb 已使用 setupMongo
初始化,db 仍然具有未初始化的版本。 不确定调用 connections.setup 的代码是什么样子的,但从这个外观来看,db !=== conn.mongodb。