Обновление атрибута объекта из метода - PullRequest
0 голосов
/ 02 октября 2018

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

Атрибут resource никогда не обновляется.Я подозреваю, что проблема масштаба, но я не знаю, как ее решить.

1 Ответ

0 голосов
/ 02 октября 2018

Использование function() для определения exports.connect и обратного вызова к MongoClient.connect приводит к изменению привязки this ("context") в теле функции к самой функции.Чтобы избежать этого, используйте синтаксис «Стрелка функции» 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
        }
    );
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...