很抱歉,如果这是一个容易的错误,我在JS方面没有太多经验,我尝试了很多方法,但都无法解决这个问题。
我可以从数据库中找到并打印我的对象,但我不能将它返回到我的主方法。
我的主要方法(它在另一个文件中,而不是数据库的方法(:
(async () => {
try{
const someClass = new SomeClass();
const object = await someClass.database.getFirstObjectFromBase("collectionName");
console.log(object);
} catch (err) {
console.log(err);
}
})();
并且(在尝试调试之前(我的";对象";未定义。看看我用过的两种方法:
async connectAndReturnWithFunction(func) {
return new Promise(
function(resolve, reject){
mongoClient.connect(url, {}, (error, client) => {
if (error) {
console.log("Cannot connect to db");
} else {
console.log("Database connection established: " + dbname);
};
const db = client.db(dbname);
return func(db);
}
);
}
)
}
最后:
async getFirstObjectFromBase(collection) {
return await this.connectAndReturnWithFunction(function(db) {
return db.collection(collection)
.findOne({}, function(err, result) {
console.log(result);
return result;
})
})
}
我也尝试了一些"then":
async getFirstObjectFromBase(collection) {
return await this.connectAndReturnWithFunction(function(db) {
return db.collection(collection)
.findOne({})
.then(result => {
console.log(result);
return result;
});
})
}
在getFirstObjectFromBase console.log(result(的两个例子中,都打印了好的对象,但程序在这之后就停止了,我无法将这个JSON返回到main方法。
谢谢你的建议:(
代码中的问题:
-
在
connectAndReturnWithFunction
函数中,您永远不会调用resolve()
-
async
函数总是返回一个Promise
,所以您不需要使用Promise
构造函数自己创建一个。您从未在connectAndReturnWithFunction
函数中使用await
关键字,因此不必将其设为async
。 -
在
connectAndReturnWithFunction
函数中,在mongoClient.connect
的回调函数中,如果出现错误,您会记录一条消息,指示无法建立与数据库的连接,但最后两行代码const db = client.db(dbname); return func(db);
仍将执行。您可能打算将这两行添加到
else
块中。mongoClient.connect(url, {}, (error, client) => { if (error) { console.log("Cannot connect to db"); } else { console.log("Database connection established: " + dbname); const db = client.db(dbname); return func(db); } }
解释object
未定义的原因,因为在connectAndReturnWithFunction
内部,您从不调用resolve()
,这是用数据库中的数据解析Promise
所必需的。
要解决此问题,请将resolve()
和reject()
函数传递给connectAndReturnWithFunction
函数的回调函数。
return func(db);
至
func(db, resolve, reject);
在getFirstObjectFromBase
函数内部,调用resolve()
函数,将result
作为参数传入。如果出现错误,请调用reject()
函数,将错误对象作为参数传入。
async getFirstObjectFromBase(collection) {
return this.connectAndReturnWithFunction(function(db, resolve, reject) {
return db.collection(collection)
.findOne({}, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
})
})
}