我正在尝试实例化导出的类,但是我收到以下错误:
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();
我在使用之前尝试创建变量,但无济于事。我做错了什么?
答案 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