![](/img/trans.png)
[英]How to return values from mongoose findOne method to the calling function
[英]How to return object from MongoDb database in findOne method
對不起,如果這很容易出錯,我在 JS 方面沒有太多經驗,我嘗試了很多方法,但我無法解決這個問題。
我可以從數據庫中找到並打印我的 object,但我無法將其返回到我的主要方法。
我的主要方法(它在另一個文件中,而不是數據庫方法):
(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) 的兩個示例中,打印良好的 object,但程序在此之后停止,我無法將此 JSON 返回到主方法。
謝謝你的建議:)
您的代碼中的問題:
在connectAndReturnWithFunction
function 內部,你永遠不會調用resolve()
async
函數始終返回Promise
,因此您無需使用Promise
構造函數自己創建一個。 您永遠不會在connectAndReturnWithFunction
function 中使用await
關鍵字,因此無需將其設為async
。
在connectAndReturnWithFunction
function 內部,在 mongoClient.connect 的回調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
function 的回調 function。
return func(db);
至
func(db, resolve, reject);
在getFirstObjectFromBase
function 中,調用resolve()
function,將result
作為參數傳遞。 如果出現錯誤,調用reject()
function,將錯誤 object 作為參數傳入。
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);
}
})
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.