Обновление атрибута объекта из метода

Я пытаюсь понять, почему следующий код не работает. По сути, я хочу обработать соединение с базой данных в модуле 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
        }
    );
};
Другие вопросы по тегам