我現在有一個包含數據庫連接模塊如下:行爲需要的node.js
var mongodb = require("mongodb");
var client = mongodb.MongoClient;
client.connect('mongodb://host:port/dbname', { auto_reconnect: true },
function(err, db) {
if (err) {
console.log(err);
} else {
// export db as member of exports
module.exports.db = db;
}
}
);
然後我就可以成功地訪問它執行以下操作:
users.js
var dbConnection = require("./db.js");
var users = dbConnection.db.collection("users");
users.find({name: 'Aaron'}).toArray(function(err, result) {
// do something
});
但是,如果我改爲導出module.exports = db
,即嘗試將exports
對象分配給db
對象,而不是使其成爲出口成員,並嘗試通過var db = require("./db.js");
來訪問users.js
中的對象,因爲該對象未定義,爲什麼?
如果是因爲設置連接延遲(require()
不應該等到模塊在分配module.exports的值之前完成其代碼的運行?),那麼爲什麼這兩個示例都不起作用?
one.js
setTimeout(function() {
module.exports.x = {test: 'value'};
}, 500);
two.js
var x = require("./one");
console.log(x.test);
OR
one.js
setTimeout(function() {
module.exports.x = {test: 'value'};
}, 500);
個
two.js
setTimeout(function() {
var x = require("./one");
console.log(x.test);
}, 1000);
運行$ node two.js
打印undefined
在這兩種情況下,而不是value
。
爲什麼設置'module.exports.db = db'工作?無論我將其設置爲「module.exports」還是「module.exports.db」,都不會發生同樣的事情嗎? – alh
這是不同的,因爲module.exports是一個對象的引用,你不會改變它來引用不同的對象。相反,你正在改變現有的對象。 – Brandon