我试图了解以下代码为何不起作用。基本上,我想在使用相同的数据库连接时处理Node模块中的数据库连接。
这是我的模块:
var MongoClient = require("mongodb").MongoClient;
var url = "mongodb://localhost:27017";
module.exports = {
resource: null,
connect: function() {
MongoClient.connect(
url,
function(err, db) {
if (err) throw err;
console.log("Connected!");
this.resource = db; // Updating the object's attribute
}
);
},
};
还有我的主文件:
var db = require('./db.js');
db.connect(); // Outputs "connected!"
http.createServer(function (req, res) {
console.log(db.resource) // Outputs "null"
}).listen(8080);
资源属性从不更新。我怀疑范围问题,但我不知道如何解决。
答案 0 :(得分:3)
使用function()
来定义exports.connect
和对MongoClient.connect
的回调都会导致函数体上的this
(“上下文”)绑定更改为函数本身。为了避免这种行为,请使用ES6'Arrow Function语法,该语法不会更改上下文绑定:
var MongoClient = require("mongodb").MongoClient;
var url = "mongodb://localhost:27017";
module.exports = {
resource: null,
connect: () => {
MongoClient.connect(
url,
(err, db) => {
if (err) throw err;
console.log("Connected!");
this.resource = db; // Updating the object's attribute
}
);
},
};
或者您可以将connect
定义移到对象之外,并通过使用完整的对象路径来分配exports.resource
,如下所示:
var MongoClient = require("mongodb").MongoClient;
var url = "mongodb://localhost:27017";
module.exports = {
resource: null,
connect: undefined
},
};
module.exports.connect = function() {
MongoClient.connect(
url,
function(err, db) {
if (err) throw err;
console.log("Connected!");
module.exports.resource = db; // Updating the object's attribute
}
);
};