gpt4 book ai didi

javascript - 为什么我在 node.js 类中得到未定义的实例?

转载 作者:行者123 更新时间:2023-12-03 10:59:05 24 4
gpt4 key购买 nike

我是 Node.js 的新手。我正在尝试为 node.js 类定义一个构造函数,该类基本上从 mongo db 获取数据。其代码如下

var MongoClient = require('mongodb').MongoClient,
Server = require('mongodb').Server;

var ObjectID = require('mongodb').ObjectID;
var mongoHost = 'localHost';
var mongoPort = 27017;

CollectionDriver = function(db) {
this.db = db;
console.log("Collection drive has been set");
};

CollectionDriver = function() {
var mongoClient = new MongoClient(new Server(mongoHost, mongoPort));
mongoClient.open(function(err, mongoClient) {
if (!mongoClient || err) {
console.error("Error! Exiting... Must start MongoDB first");
process.exit(1);
}
var db1 = mongoClient.db("Quiz");
this.db = db1;
console.log("Set Collection Driver by default");
});
};

CollectionDriver.prototype.getCollection = function(collectionName, callback) {
this.db.collection(collectionName, function(error, the_collection) {
if (error) callback(error);
else callback(null, the_collection);
});
};
//find all objects for a collection
CollectionDriver.prototype.findAll = function(collectionName, obj, callback) {
this.getCollection(collectionName, function(error, the_collection) {
if (error) callback(error);
else {
the_collection.find(obj).toArray(function(error, results) {
if (error) callback(error);
else {
console.dir(results);
callback(null, results);
}

});
}
});
};

我尝试在其他类中使用它,如下所示:

CollectionDriver = require('./collectionDriver').CollectionDriver;
var collectionDriver = new CollectionDriver(db);
OtherClassName.prototype.find = function(credentials, callback) {

collectionDriver.findAll("user_groups", credentials, function(error, results) {

if (!error) {
// Do something
}
});

// ...

每当我尝试访问 Otherclass 的 find 方法时,它都会说上述类(即 ConnectionDriver)的 db 变量未定义。但是我可以看到 ConnectionDriver 构造函数正在正确执行,并且与数据库的连接已正确打开,并且 this.db=db1 也正在执行。我做错了什么吗?任何帮助将不胜感激

最佳答案

在敲了我的头并投入(浪费)了一整天之后。我意识到了这个问题。实际上 mongoClient.open() 调用是一个异步调用,我什至在打开数据库/获取数据库实例之前就返回 CollectionDriver 对象。

我通过将 db 调用的打开移到构造函数之外并设置实例 db 解决了这个问题。修改后的代码如下:

var db = null;
var mongoClient = new MongoClient(new Server(mongoHost, mongoPort));
mongoClient.open(function(err, mongoClient) {
if (!mongoClient || err) {
console.error("Error! Exiting... Must start MongoDB first");
process.exit(1);
}
db = mongoClient.db("Quiz");

});

CollectionDriver = function() {
console.log("Set Collection Driver by default");
};

上面的代码似乎有效,但是当我将数据库实例分配给 this.db 而不是像上面那样显式声明变量时,我得到相同的未定义/空错误(当我初始化数据库变量时)为空)。有什么想法为什么会出现这种行为?

关于javascript - 为什么我在 node.js 类中得到未定义的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com