Обновление атрибута объекта из метода
Я пытаюсь понять, почему следующий код не работает. По сути, я хочу обработать соединение с базой данных в модуле 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);
Атрибут ресурса никогда не обновляется. Я подозреваю, что проблема масштаба, но я не знаю, как ее решить.
1 ответ
Решение
Использование function()
определить как exports.connect
и обратный вызов MongoClient.connect
вызывает this
("контекст") привязка к телу функции для изменения самой функции. Чтобы избежать этого, используйте синтаксис "Стрелка функции" ES6, который не меняет привязки контекста:
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
}
);
};