从方法更新对象属性

时间:2018-10-02 20:54:01

标签: javascript node.js scope node-modules

我试图了解以下代码为何不起作用。基本上,我想在使用相同的数据库连接时处理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 个答案:

答案 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
        }
    );
};