2017-09-17 59 views
0

我需要製作一個像這樣的函數。爲mongodb中的操作製作函數

function getDataFromCollection(collectionName) { 
    let data; 

    MongoClient.connect(url, function(err, db) { 
     if (err) throw err; 
     db.collection(collectionName).find({}).toArray(function(err, result) { 
      data = result; 
      console.log(result); 
      db.close(); 
     }); 
    }); 

    return data; 
} 

問題是數據未定義,但是當我執行console.log(result)時,它工作。任何想法來幫助我。提前致謝。

+0

爲什麼不使用'return result'或'res.json(result)'(如果你使用express)? – Mikhail

+0

我應該在其中寫回數結果 –

+0

而不是'data = result'和'console.log(result)' – Mikhail

回答

2

有一個非常簡單的解釋。 function(err, result)實質上是異步的,並且不會立即調用,而是在一段時間之後從mongo獲取數據。因此function(err, result)是一個回調。所以,data不會立即產生,但會過一段時間。現在,您立即返回數據,並且不要等待它被填充(在function(err, result)回調中),因此undefined顯然返回。

解決方案將使用JavaScript的Promises,它允許您使用異步代碼和回調。當我們稱之爲getDataFromCollection時,我們會返回一個Promise,並鏈接一個.then。當傳遞給resolve函數的數據在getDataFromCollection函數中解決承諾時,執行傳遞給then的函數或回調。因此,當您收到result時,將呼叫then內的回叫。

所有的代碼 -

function getDataFromCollection(collectionName) { 
     return new Promise(function(resolve, reject) { 
      MongoClient.connect(url, function(err, db) { 
       if (err) { 
        reject(err); 
        return; 
       } 
       db.collection(collectionName).find({}).toArray(function(err, result) { 
        if (err) { 
         reject(err); 
         return; 
        } 
        console.log(result); 
        db.close(); 
        resolve(result); 
       }); 
      }); 
     }); 
    } 

消費,像這樣的功能。

getDataFromCollection("collection") 
    .then(function(result) { 
     // use result 
    }) 
    .catch(function(err) { 
    console.log(err); 
    }); 

閱讀了從herePromises

+0

非常感謝你 –

+0

不客氣。 :) –