javascript - 为mongodb中的操作创建函数

标签 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)时,它起作用了。有什么想法可以帮助我。提前致谢。

最佳答案

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

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

阅读 here 中有关 Promise 的内容。

关于javascript - 为mongodb中的操作创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46266713/

相关文章:

javascript - [eslint] 中的 Vue-cli 无法读取未定义的属性(读取 'type' )错误

javascript - "smart home"物联网 WebSocket --> 服务器 WebSocket --> 客户端

mongodb - 我如何解决 : 'MongoError: $where is not allowed in this atlas tier' ?

当代码直接使用 gcc 运行时,Python C 版本为 : "undefined symbol" errror,

email - MongoDB多步事务问题

javascript - Json错误: Cannot read property 'xxx' of undefined

javascript - 是否可以让 chrome devtools 给出不同的电池电量和充电值?

javascript - 使用调度更改数组的特定值

node.js - npm - 发布具有多个版本的多个分支模块

node.js - 使用字体超棒的图标而不是项目符号动态创建列表