簡體   English   中英

無法使用 node.js 和 mongodb 以同步方式調用函數

[英]Unable to call the functions in synchronous way using node.js and mongodb

我正在嘗試使用 node.js synchronously調用一些 function 但根據我的代碼它沒有發生。 我在下面解釋我的代碼。

viewDraggedFileContent = async(req, res) => {

    try{
        let id = req.params.id;
        if(!id) {
            responseObj = {
                status: 'error',
                msg: 'Please send the mongo id to fetch the file content.',
                body: {}
            };
            res.send(responseObj);
        }else{
            let response = await findOne(id, 'useCaseFile');
            console.log('res', response);
            if(response['status'] === 0) {
                responseObj = {
                    status: 'error',
                    msg: `Error occurred`,
                    body: response['data']
                };
                res.send(responseObj);
            }else{
                const resObj = [{
                    fileData: response.data.fileData,
                    _id: response['data']['_id']
                }]
                responseObj = {
                    status: 'success',
                    msg: `Fetched data successfully`,
                    body: resObj
                };
                res.send(responseObj);
            }
        }
    }catch(error) {
        console.log('Error::', error);
    }
}

/**
 * 1- Method to fetch single record from mongoDB as per _id.
 */

findOne = async (id, collName) => {
    try{
        let mongoID = new ObjectId(id);
        MongoClient.connect(dbUrl, dbOptions).then(function (client) {
            let connObj = client.db(dbName);
            connObj.collection(collName).findOne({ _id: mongoID }, function (error, doc) {
                if (error) {
                    client.close();
                    return {
                        status: 0,
                        data: error
                    };
                } else {
                    client.close();
                    return {
                        status: 1,
                        data: doc
                    };
                }
            })
        })
    }catch(error){
        console.log('Error while fetching single record::', error);
    }
}

在這里,我從viewDraggedFileContent function 調用findOne function。我的目標是一旦所需的數據將從findOne function 返回,然后console.log('res', response); 應該執行,但根據我的代碼console.log('res', response); 在得到findOne的響應之前正在執行。 我也使用過async---await但它仍然asynchronously運行。 在這里,我需要從findOne function 獲得響應后,控制台消息應該顯示。

我認為你的問題是你沒有返回 promise 所以調用你的 findOne function 的行不會等待任何東西。

這里有兩個解決方案:

當您將回調傳遞給 db.collection.findOne function 時,它不會返回任何內容,但如果不返回,您可以等待結果,如下所示:

const doc = await connObj.collection(collName).findOne({ _id: mongoID })

然后,您可以解析您的文檔並將其返回。

另一個解決方案是在您的 findOne function 中返回一個 promise,然后發送帶有 resolve 的結果,如下所示:

findOne = async (id, collName) => {
  return new Promise((resolve, reject) => {
    try{
      let mongoID = new ObjectId(id);
      MongoClient.connect(dbUrl, dbOptions).then(function (client) {
        let connObj = client.db(dbName);
        connObj.collection(collName).findOne({ _id: mongoID }, function (error, doc) {
          if (error) {
            client.close();
            reject(error);
          } else {
            client.close();
            resolve(doc);
          }
        })
      })
    }catch(error){
      console.log('Error while fetching single record::', error);
    }
  }
}

然后,您不再需要狀態,可以使用 then 和 catch 來獲得結果。

您可以在 findOne function 中使用async/await

async function findOne(id, collName) {
  const client = await MongoClient.connect(url, {
    useUnifiedTopology: true,
  }).catch((err) => {
    console.log("Error while connecting to db", err);
  });
  if (client) {
    try {
      let mongoID = new ObjectId(id);
      let connObj = client.db(dbName);
      let doc = await connObj.collection(collName).findOne({ _id: mongoID });
      return {
        status: 1,
        data: doc,
      };
    } catch (error) {
      console.log("Error while fetching single record::", error);
      return {
        status: 0,
        data: error,
      };
    } finally {
      client.close();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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