实例化导出类的属性时出错

时间:2018-03-25 22:39:30

标签: javascript node.js mongodb express

我正在尝试实例化导出的类,但是我收到以下错误:

  

TypeError:无法设置未定义的属性'_db'

我如何创建和导出课程:

const mongodb = require('mongodb').MongoClient
const url = 'mongodb://localhost/via'
const collection = 'images'

module.exports = class DB {
    constructor() {
        mongodb.connect(url, function(err, db) {
            if (err) throw err

            this._db = db.db('via') //Error line

            this._db.createCollection(collection, function(err, res) {
                if (err) throw err
                console.log(`Collection ${collection} created successfully.`)
            })
        })
    }
}

我如何实例化:

const db = require('../db/images')
let database = new db();

我在使用之前尝试创建变量,但无济于事。我做错了什么?

1 个答案:

答案 0 :(得分:2)

这里的问题是你使用普通函数回调调用mongodb.connect的构造函数 - > function(err, db)这意味着函数this内的任何内容都不会指向您的类。

一个简单的解决方案是使用箭头功能,将function(err, db) {替换为(err, db) => {

就我个人而言,我不是箭头函数的忠实粉丝,在某些方面我认为它像with语句一样,很容易松散上下文。另一种方式,它适用于箭头功能&正常的功能是捕捉范围。

例如 - >

module.exports = class DB {
    constructor() {
        const thisDB = this;
        mongodb.connect(url, function(err, db) {
            if (err) throw err

            thisDB._db = db.db('via') //Error line

            thisDB._db.createCollection(collection, function(err, res) {
                if (err) throw err;
                //bonus, thisDB will work here too.
                console.log(`Collection ${collection} created successfully.`)
            })
        })
    }
}

上面显而易见的是thisDB点也是如此,当进行更深层次的回调时,它仍然有效,如上所示,我提到bonus, thisDB will work here too