繁体   English   中英

使函数在mongodb中运行

[英]Make functions for operations in 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)时,它可以工作。 有什么办法可以帮助我。 提前致谢。

有一个非常简单的解释。 function(err, result)本质上是异步的,不会立即调用,而是在从mongo中获取数据后的一段时间。 因此,该function(err, result)是一个回调。 因此,不是将data设置为立即生成,而是需要一段时间。 现在,您立即返回数据,而不必等待数据被填充(在function(err, result)回调内部),因此显然会返回undefined

解决方案是使用JavaScript的Promises ,它使您可以使用异步代码和回调。 我们从getDataFromCollection返回一个Promise并链接一个.then当我们调用它时。 当在getDataFromCollection函数中使用传递到resolve函数的数据解析promise时,将执行传递给then的函数或回调。 因此,里面的回调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);
   });

这里阅读有关Promises信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM