如何在findOne方法中从MongoDb数据库返回对象



很抱歉,如果这是一个容易的错误,我在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);
}
})
})
} 

最新更新