为mongodb中的操作创建函数

时间:2017-09-17 17:11:13

标签: javascript node.js 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)时,它可以工作。有任何想法可以帮助我。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这是一个非常简单的解释。 function(err, result)本质上是异步的,不会立即调用,但是在从mongo获取数据的一段时间之后。因此function(err, result)是一个回调。因此,data不会立即生效,但过了一会儿。现在,您立即返回数据并且不要等待它填充(在function(err, result)回调内),因此显然会返回undefined

解决方案是使用JavaScript Promises,它允许您使用异步代码和回调。当我们调用它时,我们会从Promise返回getDataFromCollection并链接.then。当使用传递给then函数的数据在getDataFromCollection函数内解析promise时,将执行传递给resolve的函数或回调。因此,当您收到then时,将调用result内的回调。

所有代码 -

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);
   });

here了解Promises