簡體   English   中英

如何在 findOne 方法中從 MongoDb 數據庫返回 object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM